漫談mysql索引

pythontab發表於2013-07-17

myisam和innodb的索引有什麼區別?

兩個索引都是B+樹索引,但是myisam的表儲存和索引儲存是分開的,索引儲存中存放的是表的地址。而innodb表儲存本身就是一個B+樹,它是用主鍵來做B+樹的key的。

因此innodb需要設定主鍵,如果沒有的話,mysql會優先使用unique鍵做主鍵,如果沒有unique的話,會生成一個隱含欄位做主鍵。

innodb中的主鍵最好是要使用自增id,因為這樣當進行插入操作的時候是不需要修改表的儲存結構的。

innodb的輔助索引key是輔助索引,而value則是主鍵。那麼這樣的話,innodb中主鍵如果是md5之類的字串的話,那麼每個輔助索引的磁碟空間就佔用很大,而且也有前一條的問題,當插入操作的時候還需要修改表結構。

覆蓋索引

由於innodb的輔助索引帶主鍵的機制就導致一種“覆蓋索引”的使用。就是隻需要在輔助索引中就可以進行到值查詢而不需要進行查表。比如一個InnoDB表student欄位有uid(主鍵),username,age。其中建立一個輔助索引username,那麼如果你希望查詢一個學生名為yejianfeng的學生是否存在:

select id from student where username=”yejianfeng”  (這個查詢語句是使用到覆蓋索引的,它只會去索引中進行一次查詢,而不會查表,當然如果這個表是myisam表的話,就不會覆蓋索引了)

select * from student where username=”yejianfeng”  (這個查詢是使用不到覆蓋索引的,它會去索引查詢一次,然後根據主鍵id去表中再查詢一次。所以說不要濫用*)

索引選擇性

索引選擇性是建立索引的參考指標,指的是該欄位可選擇的非重複項在總條數中佔的比例。比如說一個表中有100000的條數,有個欄位是性別欄位,這個性別它只有兩個選擇,所以它的索引選擇性就是2/100000 ~ 0.00002,那麼這種情況下,我們就沒必要再給這個欄位單獨加個索引。原因是當選擇性太小的話,比如我進行一次查詢查出來的100條中有50條是符合查詢結果的,相比於選擇性大的情況,我進行一次查詢查出來的100條中只有5條是符合查詢結果的,那麼後一種建立索引讓索引查詢出來的結果變小的效果明顯更大。而考慮到索引也佔用資源以及增刪操作的成本,選擇性太小的欄位就沒有建立索引的必要了。


相關文章