關於區分度不高的字段,比如性別,比如狀態字段,是否應該建索引?
只有2種取值的字段,建了索引數據庫也不一定會用,只會白白增加索引維護的額外開銷,因為索引也是需要存儲的,所以插入和更新的寫入操作,同時需要插入和更新你這個字段的索引的.
所以說,唯一性太差的字段不需要創建索引,即便用於where條件.
相關,建立聯合索引時,也要考慮把重復率低而又用得多的列放在前面.
比如: key (attr_id, attr_value)
聯合索引左匹配:單查 attr_id 也能使用索引,單查 attr_value 將無法利用該聯合索引.
https://bbs.csdn.net/topics/392161735
https://blog.csdn.net/Win32FanEx/article/details/79513857
那么把區分度不高(唯一性不高)的字段和區分度高的字段(唯一性高)的字段一起做聯合索引呢?
看情況,舉個例子,如果僅僅是男女,數據55開的,或者是只有1,2,3三種狀態的且相對平均分布的,這種情況下索引是沒用的(用不到的)
如果可以根據篩選條件過濾出來一個小的結果集,當然可以建索引
比如表中狀態位有1,2,3,4,5,6,7,8,9等等,3,4,5,6,7,8,9占據了大部分數據,1,2只有少部分數據,當然可以在這個字段上建索引
對於3,4,5,6,7,8,9的查詢可能不適用與索引查詢,但是對於1,2就適合索引查找,那么此時建立個索引頁無可厚非。
這種情況,應該和其他的查詢條件用到的字段,建立聯合索引,而不是建立單列索引;
比如這樣的查詢比較多:
select * from t where crdate > '2017-01-01' and sexid = '男'
可以建立如下索引:
create index ix_t on t(crdate, sexid)
