mysql的一般查詢流程如下:
mysql客戶但和伺服器中間的通訊協議時」半雙工」的。因此當查詢語句較長時引數」max_allowed_packet」很重要。
都是從資料庫中的快取獲取資料。可以通過對mysql的介面,進行設定取消緩衝。
mysql的查詢狀態(show full processlist進行查詢)
sleep:執行緒正在等待客戶端傳送新的請求
query:執行緒正在執行查詢或者正在將結果傳送給客戶端
analyzing and statistics :執行緒正在收集儲存引擎的統計資訊,並生成查詢的執行計畫
cpoy to tmp table [on disk]:執行緒正在執行查詢,並將其結果集都複製到乙個臨時表中,一般是group by操作或者union 操作
sorting result:執行緒正在對結果集進行排序
sending data:執行緒可能在多個狀態之間傳遞資料,或者在生成結果集,或者在想客戶端返回資料
mysql的快取查詢時乙個對大小寫敏感的雜湊查詢實現的。即使有乙個位元組不同,也不會匹配快取結果。
select sql_no_cache count(*) from sakila.film_actor;
show status like 'last_query_cost'
輸出:1040.599000;表示需要做1040個資料頁的隨機查詢才能完成上述操作。
由於統計資訊不準確、基於成本模型而非時間最優、不考慮其他的併發執行、不會考慮模型外的操作成本、無法估算所有成本等原因;其選擇錯誤。
主要優化策略分為兩種:
mysql能處理的優化型別有:
mysql如何執行關聯查詢
任何一次查詢都可能是關聯;mysql使用迴圈巢狀關聯,先查乙個,獲取內容;再按行進行關鍵迭代查詢;直到結束。
[外鏈轉存失敗,源站可能有防盜煉機制,建議將儲存下來直接上傳(img-kwse2d9a-1602155367895)(
執行計畫
mysql使用指令樹,而不是生成查詢位元組碼來執行查詢。
關聯查詢優化器
最重要部分,決定了多個表關聯時的順序。可以使用straight_join關鍵字重寫查詢,讓優化器按照最優的關聯順序執行。
當不同關聯的表數,超過optimizer_search_depth時,使用貪婪搜尋模式,查詢最優的關聯順序。
排序優化
排序成本相當高,應該盡可能避免排序或者避免大量資料進行排序。
mysql使用單次傳輸排序;先讀取查詢所需要的所有列;再根據給定列進行排序。相對於兩次傳輸排序(先找資料再排序,第二次讀取對應行資料);減少了i/o;但是返回的列會非常多,占用額外占用大量的空間。
查詢所需列的總長度不超過引數max_length_for_sort_data時,使用單次傳輸。
當使用limit時,先進行結果篩選再排序。
mysql重複執行計畫中的各個操作,直到完成所有的資料查詢。
一定會返回結果,即使為空。返回過程是乙個增量、逐步返回的過程。一旦伺服器處理完最後乙個關聯表。開始生成第一條結果時,mysql就可以開始向客戶端逐步返回結果集了。
結果集中的每一行都會以乙個滿足mysql客戶端/伺服器通訊協議的封包傳送,再通過tcp協議進行傳輸。
MySQL查詢執行的基礎
當希望mysql能夠以更高的效能執行查詢時,最好的辦法就是弄清楚mysql是如何優化和執行查詢的。一旦理解這一點,很多查詢優化實際上就是遵循一些原則讓優化器能夠按照預想的合理的方式執行。換句話說,是時候回頭看看我們之前討論的內容了 mysql執行乙個查詢的過程。當向mysql傳送乙個請求的時候,my...
4 4 查詢執行的基礎
mysql執行乙個查詢的過程,可以用下圖表示 我們可以看到當向mysql傳送乙個請求的時候,mysql究竟做了什麼 1 客戶端傳送一條查詢給伺服器。2 伺服器先檢查查詢快取,如果命中了快取,則立刻返回儲存在快取中的結果。否則進入下乙個階段。3 伺服器端進行sql解析 預處理,再由優化器生成對應的執行...
MySQL查詢執行的基礎 查詢優化處理
查詢的生命週期的下一步是將乙個sql轉換成乙個可執行計畫,mysql再按照這個計畫和儲存引擎進行互動 預處理器則會根據一些mysql規則進一步檢查解析樹是否合法。它會檢查資料表和資料列是否存在,還會解析名字和別名,看看它們是否存在歧義。當語法樹被認為是合法的時候,將轉由優化器去轉化成執行計畫。一條查...