高性能索引2

獨立的列

一句話概括 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;

sel3sel4sel5sel6sel7
0.02390.02930.03050.03090.0310

前綴索引不能用於 ORDER BY GROUP BY  也不能做覆蓋掃描


關於多列索引

不要用多列獨立索引


關於索引列的位置排序

經驗法則: 將選擇性最高的列放到索引列最前列。

select count(*),sum(groupid=10137),sum(userid=1288826),sum(anom=0) from message\G;



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章