問題背景 :
當我們需要創建一個組合索引, 索引的順序對於效率影響很大, 怎么確定索引的順序;
解決方法 :
我們應該依據字段的全局基數和選擇性, 而不是字段的某個具體的值來確定;
表結構 :
dc_listing
代碼 :
SELECT
COUNT(DISTINCT accountId) / COUNT(*) AS accountId_sel,
COUNT(DISTINCT userName) / COUNT(*) AS userName_sel,
COUNT(*)
FROM
dc_listing
結果:
可以看到accountId的選擇性更高, 所以我們應該講accountId這個字段放在組合索引前面
存在問題 :
對於一些特殊的值, 比如超級用戶, 如果他滿足大部分的查詢條件, 即這個基數對這個值可以說是無效的參考.
避免這種問題, 只能從代碼層面屏蔽, 區分這類數據合組, 禁止針對這類值進行這個查詢;
參考 msyql高性能 5.3.4 章節, 有更詳細例子