查詢的生命週期大致可以按照順序來看:從客戶端,到伺服器,然後在伺服器上進行解析,生成執行計畫,執行,並返回結果給客戶端。其中"執行"可以認為是整個生命週期中最重要的階段,這其中包括了大量為了檢索資料到儲存引擎的呼叫以及呼叫後的資料處理,包括排序、分組等。
對於低效的查詢,通過下面兩個步驟來分析總是很有效:
1.確認應用程式是否在檢索大量超過需要的資料。這通常意味著訪問了太多的行,但是也有可能訪問太多的列。
2.確認mysql伺服器層是否在分析大量超過需要的資料行。
是否向資料庫請求了不需要的資料
查詢不需要的記錄:乙個常見的錯誤先查出所有結果集,然後獲取前面n行後關閉結果集,解決方法是加上limit。
多表關聯時返回全部列:應該按需求只返回需要的列
總是取出全部列:審視select *的寫法
重複查詢相同資料
mysql是否在掃瞄額外的記錄
查詢開銷的三個指標:
1.響應時間
2.掃瞄的行數
3.返回的行數
從慢日誌可以看到這三個指標。
掃瞄的行數和訪問型別:
在explain的type列反應了訪問型別。訪問型別有多種:全表掃瞄、索引掃瞄、範圍掃瞄、唯一索引查詢、常數引用等。
一般mysql能夠使用如下三種方式應用where條件,從好到壞依次為:
1.在索引中使用where條件來過濾不匹配的記錄,這是在儲存引擎完成的。
2.使用索引覆蓋掃瞄(在extra列**現了using index)來返回記錄,直接從索引中過濾不需要的記錄並返回命中的結果,這是在伺服器層完成的,無需回表查詢記錄。
3.從資料表中返回資料,然後過濾不滿足條件的記錄(在extra列**現using where)。伺服器層完成的。
具體優化的手段
切分查詢
將大查詢切分成小查詢,每個查詢功能完全一樣,只完成一小部分。
分解關聯查詢
1.讓查詢快取的效率更高,重複利用快取。
2.將查詢分解後,執行單個查詢可以減少鎖的競爭。
3.在應用層做關聯,可以更容易對資料庫進行拆分,更容易做到高效能和可擴充套件。
4.查詢本身效率也可能會有所提公升。
5.減少冗餘記錄的查詢
6.相當於在應用中實現了雜湊關聯,而不是使用mysql的巢狀迴圈關聯。
查詢執行的基礎:
1.客戶端傳送一條查詢給伺服器
2.伺服器先檢查查詢快取,如果命中了快取,則立刻返回儲存在快取中的結果。否則進入下一階段。
3.服務端進行sql解析、預處理、再由優化器生產對應的執行計畫。
4.mysql根據優化器生成的執行計畫,呼叫儲存引擎的api來執行查詢。
5.將結果返回給客戶端。
關聯子查詢
select * from sakila.film where film_id in (select film_id from salila.film_actor where actor_id = 1);
以為會這樣執行:
select * from sakila.film where film_id in (***,***,***);
實際上:
select* from salila.film where exists (select * from sakila.film_actor where actor_id = 1 and film_actor.film_id =
film.film_id);
改寫方法:
1.改寫成關聯查詢
select film.* from sakila.film inner join sakila.film_actor using(film_id) where actor_id = 1;
2.另乙個優化的方法是使用函式group_concat()在in()中構造乙個由逗號分隔的列表(使用in+子查詢,效能經常會非常糟)。有時這比使用關聯改寫更快。
3.也可以用優化器優化的方式,即上面第二種
1.優化count():,myisam在count(*)全表時可以直接獲取這個值,非常快,可以利用這個進行簡單優化。
2.優化關聯查詢:確保on或者using子句中的列上有索引。在建立索引的時候就要考慮到關聯的順序,一般來說,除非有其他理由,否則只需要在關聯順序中的第二個表的相應列上建立索引。
確保任何的group by和order by中的表示式只涉及到乙個表中的列,這樣mysql才有可能使用索引來優化這個過程。
3.優化子查詢:盡可能使用關聯查詢代替
4.優化group by和distinct:group by的列推薦使用標識列
5.優化limit分頁:limit 10000,20這樣的查詢,mysql需要查詢10020條記錄然後只返回最後20條,前面10000都被拋棄,這樣的代價非常高。優化方法:①利用延遲關聯改寫查詢,即先查出主鍵,再用主鍵去查相應的列。②limit查詢轉換為已知位置的查詢。三、limit和offset的問題,其實是offset的問題,所以想辦法把offset用已知位置替代,避免使用offset。
mysql查詢效能優化 MySQL 查詢效能優化
在日常開發中,程式設計師寫的最多的除了bug之外,應該算是sql語句了。sql的質量影響了程式的響應速度,只有利用mysql的特性,才能讓mysql更有效的執行查詢sql,充分發揮mysql的優勢,並避開它的弱點。為什麼查詢速度會慢?在編寫sql之前,需要清楚一點 真正重要的是響應時間。如果我們把查...
mysql 查詢效能優化
mysql 執行查詢,客戶端向 mysql 傳送請求的時候,mysql 伺服器執行一系列過程,保證查詢語句在 mysql 中得到最高效能的效率。客戶端傳送一條查詢給伺服器 2 伺服器先檢查查詢快取,如果命中了快取,則返回儲存在快取中的結果。否則,進入下乙個階段。3 伺服器進行 sql解析 預處理,再...
mysql查詢效能優化
mysql執行查詢的過程 如圖 1 客戶端首先通過客戶端 伺服器通訊協議與mysql伺服器建立起連線 2 客戶端傳送一條sql語句 判斷是否為查詢語句,如果是查詢語句,則先在查詢快取區雜湊查詢對應sql的資料,如果未找到,則需要呼叫解析器解析 預處理 再由優化器生成對應的查詢執行計畫 3 mysql...