1. 程式人生 > >MYSQL中為什麼索引不宜建在重複資料多的列上

MYSQL中為什麼索引不宜建在重複資料多的列上

昨天想了一天這個問題

首先我們先粗略的說一說:

加入有一個查詢語句要查詢性別為男生的資料,因為這樣的資料很多,我們要掃描很多次索引,然後再去取這個性別為男的資料。

那麼分為兩部分,先掃描索引,然後去取這個符合要求的資料

如果我們不建立索引,那麼去掃描整個表。

不建立索引需要的時間=T掃描整個表                            建立索引需要的時間= T去索引中取+T取相應的資料條件 

我們去考慮一種極限,如果性別全為男,那麼我們建立索引去查詢的時間就是T掃描整個索引表+T掃描整個表。那麼耗時肯定過大了。所以得出我們的結論

我們在通過innodb和MyISAM來細說

MyISAm中:就是類似於上面的描述,需要先去掃描索引樹,再去掃描表。

Innodb中:它的索引和資料在一起,它的非聚簇索引中保留了當前列和主鍵列的索引,每次查還要去主鍵索引查詢整個信心,因為主鍵的索引是包含所有節點資訊的,那麼非聚簇索引向聚簇索引轉換時就會出現問題時間消耗,如同上面的情況。

有人可能會問,如果放在聚簇索引上查詢重複多個列,那不就沒關係了,問題是聚集索引是唯一的,不能重複

關於索引的儲存結構:

這兩篇文章都不錯,不過我覺得第一篇寫的更好。