MySQL高级之查询优化(索引失效)
生活随笔
收集整理的這篇文章主要介紹了
MySQL高级之查询优化(索引失效)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
MySQL高級之查詢優化(索引失效)
文章目錄
- MySQL高級之查詢優化(索引失效)
- 一、單表使用索引及常見的索引失效
- 1.索引失效的案例
- 2.建議
- 二、關聯查詢優化
- 1.建表
- 2.案例
- 3.優化
- 三、子查詢優化
- 四、排序分組優化
- 1.case
- 2.order by子句,盡量使用Index方式排序,避免使用FileSort排序
- 3.索引的選擇
- 4.如果不在索引列上,firesort有兩種算法:雙路排序和單路排序
- 5.Group by的優化
一、單表使用索引及常見的索引失效
1.索引失效的案例
- 全值匹配我最愛
- 全值匹配指的是我要查詢的語句的字段順序恰好和建立的索引的字段順序一致,否則索引失效
- 最佳左前綴法則
- 如果索引了多列(覆蓋索引),要遵守最左前綴法則,指的是查詢從索引的最左前列開始并且不跳過索引中的列
- 不在索引列上做任何操作
- 這里的任何操作包括計算、函數、(自動or手動)類型轉換,會導致索引失效而轉向全表掃描
- 存儲引擎不能使用索引中的范圍條件右邊的列
- mysql在使用不等于(!=或者<>)的時候無法使用索引導致全表掃描
- is null,is not null也無法使用索引(這種說法不唯一,綜合考察SQL語句所涉及表的索引、數據分布、統計信息,才能綜合判斷,用通俗的話來說要結合具體場景)
- like以通配符開頭(’%abc…’)索引失效會變成全表掃描
- 字符串不加單引號索引失效
- 少用or,用它來連接時會索引失效
小總結:
2.建議
- 對于單鍵索引,盡量選擇針對當前query過濾性更好的索引
- 在選擇組合索引的時候,當前query中過濾性最好的字段在索引字段順序中,位置越靠前越好
- 在選擇組合索引的時候,盡量選擇可以能夠包含當前query中的where子句中更多字段的索引
- 盡可能通過分析統計信息和調整query的寫法來達到選擇合適索引的目的
優化總結口訣:
- 全值匹配我最愛,最左前綴要遵守;
- 帶頭大哥不能死,中間兄弟不能斷;
- 索引列上少計算,范圍之后全失效;
- LIKE百分寫最右,覆蓋索引不寫星;
- 不能空值還有OR,索引失效要少用;
- VAR引號不可丟,SQL高級也不難;
二、關聯查詢優化
1.建表
2.案例
3.優化
- 保證驅動表的join字段已被索引
- left join時選擇小表作為驅動表,大表作為被驅動表
- inner join時,mysql會自己幫你把小結果的表作為驅動表
- 子查詢盡量不要放在被驅動表,有時可能使用不到索引
- 能夠直接多表關聯的盡量直接多表關聯,不用子查詢
三、子查詢優化
- 盡量不要使用not in或者not exist,用left join ... on替換exist
四、排序分組優化
1.case
2.order by子句,盡量使用Index方式排序,避免使用FileSort排序
3.索引的選擇
4.如果不在索引列上,firesort有兩種算法:雙路排序和單路排序
-
雙路排序
-
單路排序
-
結論和問題
-
由于單路是后出的,比雙路排序好
-
用單路的問題:
-
優化策略
-
原理:
5.Group by的優化
總結
以上是生活随笔為你收集整理的MySQL高级之查询优化(索引失效)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MySQL高级之explain详解
- 下一篇: MySQL三大日志及主从复制的原理