高效能索引策略二

長毛的茄子發表於2019-02-22

多列索引

一個誤區:一個常見的錯誤就是,為每個列建立獨立的索引,或者按照錯誤的順序建立多了索引。

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索引一樣按照順序儲存資料)

  對於如何選擇索引列順序有一個檢驗法則:將選擇性最高的列放在做索引的最前列。

相關文章