1. 程式人生 > >從性別欄位不適合建索引說起

從性別欄位不適合建索引說起

理論文章會告訴你值重複率高的欄位不適合建索引。不要說性別欄位只有兩個值,網友親測,一個欄位使用拼音首字母做值,共有26種可能,加上索引後,百萬加的資料量,使用索引的速度比不使用索引要慢!

一個表可能會涉及兩個資料結構(檔案),一個是表本身,存放表中的資料,另一個是索引。索引是什麼?它就是把一個或幾個欄位(組合索引)按規律排列起來,再附上該欄位所在行資料的實體地址(位於表中)。比如我們有個欄位是年齡,如果要選取某個年齡段的所有行,那麼一般情況下可能需要進行一次全表掃描。但如果以這個年齡段建個索引,那麼索引中會按年齡值建一個排列,這樣在索引中就能迅速定位,不需要進行全表掃描。

為什麼性別不適合建索引呢?因為你訪問索引需要付出額外的IO開銷,你從索引中拿到的只是地址,要想真正訪問到資料還是要對錶進行一次IO。假如你要從表的100萬行資料中取幾個資料,那麼利用索引迅速定位,訪問索引的這IO開銷就非常值了。但如果你是從100萬行資料中取50萬行資料,就比如性別欄位,那你相對需要訪問50萬次索引,再訪問50萬次表,加起來的開銷並不會比直接對錶進行一次完整掃描小。

當然凡事不是絕對,如果把性別欄位設為表的聚集索引,那麼就肯定能加快大約一半該欄位的查詢速度了。聚集索引指的是表本身中資料按哪個欄位的值來進行排序。因此,聚集索引只能有一個,而且使用聚集索引不會付出額外IO開銷。當然你得能捨得把聚集索引這麼寶貴資源用到性別欄位上。

參考文章:

https://www.cnblogs.com/sunxi/p/4011592.html

http://www.cnblogs.com/Lovepanda/archive/2010/03/24/MySql.html