在我學習了索引如何使用後,我開始有一些問題,而最根本的原因就是我不知道本質上索引是什麼,所以本文就是針對索引的本質來講下他的原理的。但是只以btree為例,其他資料結構或則演算法的索引原理會在其他文章講解。
1.什麼是索引?
首先,當我看見有一種索引的建立語句是如下的時候,create index index_name on table_name( column)。我是這樣猜測的:我覺得索引首先是取出了一列或者幾個特殊的列,然後把他們重新命名為index_name,然後存起來了。存的方式就是用特殊的資料結構,比如二叉樹。(因為我之前在學習資料結構的時候知道二叉樹可以增加查詢速度)。但是我不知道他是存在快取還是**?
(我個人習慣在學習乙個東西的應用後思考它的本質是怎麼回事,然後開始猜測,然後再找資料驗證。這是我個人的學習習慣。)
經過我查閱資料,我發現索引是一種資料結構。索引中是包含乙個表中列的值和它的實體地址的值,並且這些值儲存在乙個資料結構中。
注意:
-------索引可以儲存的資料結構有多種,常用的有二叉樹,還是有雜湊表。這個有很多。
-------索引中存的資料:其中只存乙個表中的一列或者多列。如果是單索引就是存一列,如果使用的是復合索引就是多列。但是注意不要多列的概念,如果我在乙個employee表中有(employee_id,employee_name,employee_age)3個屬性。
eg: create index employee_name on employee(employee_name); 那麼資料結構中只存employee_name的所有值和employee_name值相應的磁碟實體地址。至於employee_id和employee_age都不會在索引中存在。
eg: create index employee_name on employee(employee_id employee_name)那麼存的是employee_id 的值和employee_name的值。但是employee_age不會有。
2.索引能用來幹什麼?
當我們建立索引後,會增加查詢的效率,多數情況下會比全表掃瞄要快。
現在我們來解釋一下,如果沒有索引是怎麼進行查詢操作的?
看下面的:當我們的select是查詢empno=4的時候,dbms會生成乙個類似指標的東西,從empno=1的地方開始搜尋,一直搜尋到表的結束,這裡是empno=11.
那麼有人會問,為什麼他搜尋到empno=4為什麼不停止呢?我們沒有索引的select是全表掃瞄,就是必須把整個表都掃瞄一次後才告訴dbms,查詢結果是什麼?
開始的時候我有乙個問題,就是如果我們掃瞄的是主鍵,當他找到乙個結果的時候,因為我用的是where語句,是不是就會停止,答案是,和掃瞄的是不是主鍵並沒有關係。不新增index就是全表掃瞄。
所以掃瞄結果會慢。
現在我們再來看下,如果建立了索引會出現什麼情況?為什麼就會變快了?
我們還是拿剛剛的舉例子,當我們使用二叉樹建立的索引,還要掃瞄empno這屬性列的時候,4只需要和6.3.5.4比較4回就會找到結果,和剛剛的11次,相比快了很多。當資料越大的時候,速度就會快的更明顯。因為每次都是減掉一半的資料。
3.索引的分類
---------索引型別:主鍵索引,普通索引,全文索引,唯一索引
3.1主鍵索引
主鍵索引的新增:
方法一: 在建立表的時候直接建立
create table table_name(id int unsiged primary key auto_increment,
name varchar(20) not null default ' ' );
方法二:先建立表,後建立index
alter table table_name add primary key ( column_name );
提問:在看完主鍵索引的建立方式後,你會不會和我一樣,覺得這和主鍵的建立沒有區別?
答:主鍵是字段中唯一不為空值的列,主鍵是一種約束。同時主鍵索引是一種特殊的唯一索引。
那麼建立主鍵的時候,資料庫會預設為主鍵建立乙個唯一索引,那會為主鍵建立乙個主鍵索引嗎?
他倆是一回事嗎?(我在找下資料哈)
3.2全文索引
3.3普通索引
普通索引就是針對普通的列,根據第4點(什麼樣的列適合做索引)而建立的索引。
建立方式就是先建立表,根據需要選擇要建立的索引列。
3.4 唯一性索引
更新中,乙個小時候更新。
3.5 索引的查詢:
方法一:
desc table_name【缺點:不能查到index的名字】
方法二:
3.6 索引的刪除:
alter table table_name drop index index_name;
4.哪些時候需要用到索引?
------當這個語句被頻繁用作where條件的查詢時,最好建立索引
------該字段的列的值很豐富的時候,不是唯一幾個值時可以建立索引(比如唯一性太差不適合,例如***)
-------更新頻率不是十分頻繁的時候(如果這個列的資料的變化十分的頻繁,那麼頻繁的更改索引檔案,會有更多的消耗)
5.使用索引的時候需要注意什麼?
------ 使用索引的時候是有代價的:比如占用磁碟的代價;或者對dml(update,insert,destroy)操作的影響。
所以說建立索引增加的效率多數就是對select的,對dml其實是***。
------- 對於復合索引來說,只是查詢條件使用了最左面的列,索引才會有作用。(復合索引就是多列了)
eg: create index dept add index my_ind(dname,loc);
//dname為最左面的列,loc為右面的列。
失效:select * from dept where loc ='aaa'; 就是這個語句其實在查詢的時候沒有用到索引。
-------- 對於用模糊查詢,查詢結果如果是「%aaa」不會使用索引,「aaa%」會使用索引。
mysql的索引本質
1索引的定義 索引是幫助mysql高效獲取資料的排好序的資料結構 2 索引的本質 就是拍好序的資料結構 3.為啥b tree這種資料結構做索引的效率比其他的資料結構 紅黑樹,二叉樹,平衡二叉樹,hash表 效率高 具體的比較可以參考我之前的文章 主要是有以下幾個優點 b 樹的優點 1 b 樹的層級更...
索引的本質與挑選索引
2 索引的代價 3 索引使用策略與優化 4 參考鏈結 索引是幫助mysql高效獲取資料的資料結構。索引的本質其實就是b 樹,而b 樹是對b樹的優化。所以還得先從b樹說起。1 實現思路 索引的主要作用是為了查詢資料,對於樹這樣的資料結構來說,樹的高度越低,那麼查詢節點的效率也就越高。將二叉樹的結構改變...
索引的本質是排序
索引是經常用到的技術,但有些程式設計師對索引的原理了解不深,發現資料查詢效能有問題立刻就想起建索引,但效果常常也不盡人意。那麼到底什麼時候該用索引以及該怎麼用?我們來分析索引清理背後的技術原理就知道了。索引技術的初衷是為了快速從乙個大資料集中找出某個字段等於確定值 比如按身份證號找出某個人 的記錄。...