獨立的列
一句話概括 where 子句中 條件列得統一放左邊
例如 where aid+1=5 這純屬搗亂
還有 where TO_DAYS(CURRENT_DATE)-TO_DAYS(date_col)<=10;
前綴索引和索引選擇性
場景應用 字符列太長 帶來的索引慢的問題
對於 BLOB text 或者更長的 varchar 都是要使用前綴索引的
從兩個角度分析
情景 城市名稱記錄
完整列的選擇性
select count(*) as cnt,city from city GROUP BY city ORDER BY cnt desc limit 10;
測出 這個city列的大致分佈
通過
select COUNT(*) AS cnt,LEFT(city,7) as pref FROM city GROUP BY pre ORDER BY cnt DESC LIMIT 10;
比較兩個代表值是否接近
⑴ select COUNT(DISTINCT city)/COUNT(*) FROM city;
0.0312
計算不同長度選擇性
⑵ select COUNT(DISTINCT LEFT(city,3))/COUNT(*) AS sel3,COUNT(DISTINCT LEFT(city,4))/COUNT(*) AS sel4,COUNT(DISTINCT LEFT(city,5))/COUNT(*) AS sel5,
COUNT(DISTINCT LEFT(city,6))/COUNT(*) AS sel6 ,COUNT(DISTINCT LEFT(city,7))/COUNT(*) AS sel7 FROM city;
結合 1 2 語句判斷接近這個0.0312的均可以使用。但實際上並非如此
如select COUNT(*) AS cnt,LEFT(city,4) AS pref FROM city group by pref ORDER BY cnt DESC LIMIT 5;
sel3 | sel4 | sel5 | sel6 | sel7 |
0.0239 | 0.0293 | 0.0305 | 0.0309 | 0.0310 |
前綴索引不能用於 ORDER BY GROUP BY 也不能做覆蓋掃描
關於多列索引
不要用多列獨立索引
關於索引列的位置排序
經驗法則: 將選擇性最高的列放到索引列最前列。
select count(*),sum(groupid=10137),sum(userid=1288826),sum(anom=0) from message\G;