-
應用WHERE語句的條件
在索引中使用where條件來過濾不匹配的記錄,在存儲引擎層過濾完成
使用索引覆蓋掃描(Extra中出現了Using index)來返回記錄,直接從索引中過濾不需要的 記錄並返回命中結果,這是在MySQL服務層完成的,但無須再回表查詢記錄。
從數據表中返回記錄,然後過濾不滿足條件的記錄(在Extra出現Using Where)這是在服務層完成的 , MySQL需要先從數據表讀出記錄然後過濾。
-
若查詢中需要掃描大量的數據只返回少數的行
使用索引覆蓋,把需要用到的列都放到索引中,這樣存儲引擎無需回表獲取對應行就可以返回結果了
改變庫表結果例如使用單獨彙總表
重寫這個複雜的查詢,讓MySQL優化器 能夠以更優化的方式執行這個查詢
-
重構查詢方式
一個複雜查詢or多個簡單查詢
切分查詢:分而治之
分解關聯查詢:對每個表進行一次單表查詢,然後在應用程序中進行關聯
分解關聯查詢的優勢:1.讓緩存的效率更高。 2.執行單個查詢可以減少鎖的競爭。 3. 在應用層進行關聯,可以更容易對數據庫進行拆分,更容易做到高性能和可擴展。4. 查詢本身效率可能會有提升。5.減少冗餘記錄的查詢。6.這樣相當於在應用中實現了哈希關聯, 而不是使用MySQL的嵌套循環關聯。
查詢緩存
-
MySQL的優化類型
重新定義關聯表的順序
將外鏈接轉化成內連接
使用等價變換規則
優化count()min()max()
預估並轉化爲常數表達式
覆蓋索引掃描
子查詢優化
提前終止查詢
等值傳播
列表IN()的比較:mysql會將in()列表裏面的內容排序再利用二分查找來確定列表的值是否滿足條件這是一個logn的操作
-
MySQL查詢過程
1.查緩存,若緩存中沒有轉2,否則返回結果
2.預處理,優化得到優化樹 生成執行計劃 轉3
3.查詢執行引擎,調用執行引擎的api執行查詢
4.返回查詢結果,如果結果可以被緩存,就緩存,結果集返回給客戶端是一個增量、 逐步返回的過程 ,結果集中每一行都會以一個滿足MySQL客戶端/服務器通信協議的風暴發送, 再通過tcp協議進行傳送,在tcp傳送中可能對MySQL的封包進行緩存然後批量進行傳輸
-
優化關聯查詢
確保on或者using子句中的列上有索引,在創建索引的時候就要考慮到關聯的順序。 一般在關聯順序的第二個表的相應列上創建索引
確保group by 和order by的表達式只涉及到一個表的列
當升級MySQL的時候需要注意:關聯語法,運算符優先級等其他可能會發生變化的地方
索引優化
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.