多列索引 一個誤區:一個常見的錯誤就是,為每個列創建獨立的索引,或者按照錯誤的順序創建多了索引。 1. 為什麼要建立多了索引 在每個列創建獨立索引一般是由於聽到諸如“吧where條件裡面的列都建立上索引”這樣模糊的建議導致的,實際上這個建議的非常錯誤的,在多個列上簡歷獨立的單列索引大部分情況下並不能 ...
多列索引
一個誤區:一個常見的錯誤就是,為每個列創建獨立的索引,或者按照錯誤的順序創建多了索引。
1. 為什麼要建立多了索引
在每個列創建獨立索引一般是由於聽到諸如“吧where條件裡面的列都建立上索引”這樣模糊的建議導致的,實際上這個建議的非常錯誤的,在多個列上簡歷獨立的單列索引大部分情況下並不能提高mysql的查詢性能。
索引合併策略:
mysql5.0和更新版本引入了一種叫“做陰合併”的策略,一定程度上可以使用表上的多個單列索引來定位指定的行,更早版本的mysql只能使用其中某一個單列索引,然而這種情況下沒有哪一個獨立的單列索引是非常有有效的,例如在file_id和actor_id上各有一個單列索引。但對於下麵的這個查詢where條件,這倆個單列索引都不試最好的選擇;
mysql>SELECT file_id,actor_id FORM file_actor WHERE file_id = 1 OR actor_id = 1;
在老的mysql版本中,mysql會對這個查詢使用權標掃描,但在mysql5.0和更新版本中,查詢能夠同時使用這倆個單列索引進行掃描,並將結果合併,這種演算法有三個變種:OR條件的聯合(union),AND條件的相交(intersection),組合前倆種情況下的聯合和相交。
什麼時候使用多了索引
當伺服器對多個索引做相交操作時(通常有多個AND條件)
當伺服器對多個索引做聯合操作時(通常有多個OR條件)
2.選擇合適的索引列順序
在一個B-Tree索引中,索引列的順序意味著索引首先按照最左列進行排序(最左原則),其次是第二列,等等。(順便說明本篇文章內容使用於B-Tree索引,哈希索引或者其他類型索引並不會想B-Tree索引一樣按照順序存儲數據)
對於如何選擇索引列順序有一個檢驗法則:將選擇性最高的列放在做索引的最前列。