深入淺出mysql筆記 18章SQL優化

2021-08-19 14:06:51 字數 1600 閱讀 3551

一、定位執行慢的sql語句

1、通過查詢慢日誌定位執行效率低的sql語句。

2、通過show processlist 命令檢視

3、通過explan 分析低效語句

type = all 全表,index 索引全掃瞄,range 索引範圍掃瞄,ref 非唯一索引或者唯一索引的字首掃瞄返回匹配某個單獨值記錄, eq_ref 掃瞄唯一索引,const/system 當作常量處理根據主鍵或者唯一索引

key: ....用到的索引

possible_keys:可能用到的索引

extra: using where 除了利用索引來加速還需要根據索引的回表查詢;using index 只匹配索引不用回表查詢 術語覆蓋索引;using index conditon 5.6已上版本應用了icp把過濾操作下推到儲存引擎 有些模糊理解 

二、確定問題採取優化措施

1、字首索引在排序 order by 和group by操作的時候無法使用

2、btree 索引 --》平衡二叉樹

3、explain select * from actor where last_name like '%ni%'\g ,在字首綴中用表示式,不會用到索引如 like 『*ni' ,字尾會採用like 『ni*' 

解決辦法explain select * from (select actor_id from actor where last_name like '%ni%')a, actor b where a.actor_id = b.actor_id\g   通過二級索引獲得滿足條件的主鍵然後用主鍵去回表檢索記錄

4、資料隱含或者表示式不會用到索引 :隱式轉換特別列是字串有索引,where後條件中把字元常量值用引號引起來 防止進行隱式轉換導致用不上索引

例如where a=1 解決辦法 where a='1';

5、用or分割條件,如果or前面的列有索引,而後面的列沒有索引,那麼涉及到的索引都不會引用.

6、優化order by:儘量減少額外排序,通過索引直接返回有序資料。where條件與order by使用相同的索引。

7、優化巢狀查詢改為join替代,因為巢狀查詢要在記憶體中建立臨表。

8、優化or查詢 :在復合索引上用or操作用不到索引,需要針對or每個條件單獨建索引。

9、優化分頁查詢:現在索引上過濾或者排序,然後再通過join連線根據主鍵進行回表查詢。例如:

select film_id ,description from film order by title limit 50,5\g;

優化後語句:select a.film_id,a.descrption from film a inner join (select film_id from film order by title limit 50,5)b on a.film_id = b.film_id\g;

先在title索引上過濾和排序,然後根據title索引上的主鍵在進行回表查詢。

10、在統計查詢中,借助中間表。 中間表可以靈活的新增索引和增加臨時字段,從而達到提高統計效率和輔助統計的作用。

11、通過水平或者垂直拆分表。

12、外來鍵列上缺少索引會帶來三個問題,限制併發性、影響效能、還有可能造成死鎖。所以對於絕大部分場景,我們應該盡量考慮在外鍵上面建立索引

深入淺出MySQL

說明索引的設計和使用 sql中的安全問題 常用sql技巧 sql優化過程 優化資料庫物件 鎖問題 本站 深入淺出mysql 個人部落格 深入淺出mysql 1 設計索引原則 2 小常識 3 btree索引 1 了解sql執行頻率 使用show session global statusa來獲得伺服器...

深入淺出MySQL筆記(二)

本筆記為學習該書所記,便於複習。包含第三 四章筆記。資料型別與運算子 toc 整數型別 zerofill unsigned auto increment 浮點數型別 定點數型別 decimal m,d show warningsl 位型別bit m hex data datatime timesta...

深入淺出MySQL筆記(三)

本筆記為學習該書所記,便於複習。包含第五 六章筆記。常用函式與圖形化工具的使用。toc 常用字串函式 concat s1,s2.sn 連線s1,s2.sn為乙個字串 insert str,x,y,instr 將字串str從第x位置開始,y個字元長的子串替換為字串instr lower str 將字串...