在mysql中,提供給優化器使用的統計資料是由儲存引擎提供,例如表或索引的頁面數量、鍵和行的長度等資訊。
由優化器產生的執行計畫是乙個樹形結構,用於指導執行引擎產生結果,其結構為乙個左深度樹.如:
join
join tbl4
join tbl3
tbl1 tbl2
mysql聯接優化器是優化器中最重要的部分,決定了多表查詢的最佳執行順序。mysql使用迴圈巢狀的方式來進行聯接操作,具體來說,就是總是嘗試對當前表的一行,去找到聯接表的匹配行,回溯,然後繼續下一行匹配。這樣,不同的聯接順序將產生不同的開銷。
當然,優化器有時不一定會得到更優的方案,可以使用straight_join引數強制按照查詢中表的聯接順序來執行查詢。
當有很多表進行聯接的時,組合方案將急速上公升,當表的數量超過optimizer_search_dpth時,mysql會採用一些快速的搜尋策略(具體需要分析源**),有的查詢不能被重新排序(如 left join),聯接優化器也會利用這些客觀情況,減小搜尋空間。
排序優化
mysql可以利用索引來加快排序,但當沒有索引時,則需要自己對結果進行排序
當待排序資料數量和排序快取大小相當,則在記憶體內利用快速排序進行排序;
否則,就在磁碟上對資料進行分塊,對每塊資料進行快速排序,然後進行合併
兩種檔案排序方法:
雙路排序——先讀取行和執行order by的列,進行排序後,再次掃瞄表,讀取對應行。
單路排序——直接讀取查詢需要的所有列,進行排序後輸出特定列。
在排序聯接的時候。若orderby的第乙個表,則先對該錶進行排序。然後處理聯接,否則,先將聯接結果儲存到臨時表中,然後對臨時表進行排序。
執行結果傳送
伺服器增量的產生和傳送結果,當處理完所有表,並產生一行輸出開始,就會把結果傳送到客戶端。如果查詢是可快取的,還會在伺服器端進行快取
mysql查詢優化(1)
參考 優化查詢語句時,主要考慮以下幾點 a and b and c or a and b and c and d a and b and c or a and b and c and d aand b c and a 5 b 5 and b c and a 5 b 5 and b 5 or b 6 ...
MySQL筆記(查詢優化)
查詢效能優化 基本原則 優化資料訪問 一些典型的錯誤包括 提取了超過需要的行 多表聯接時提取所有列或提取所有的列 select 可能會造成覆蓋索引這樣的優化手段失效 mysql中,最簡單的開銷指標包括 1.執行時間 2.檢查的行數 3.返回的行數 通過使用索引,在explain時可以減少處理的行數 ...
查詢優化(MySQL優化查詢)
關聯查詢太多join 設計缺陷或不得已的需求 資料庫伺服器調優及各個引數設定不適當 緩衝 執行緒數等 慢查詢日誌 找出執行速度慢的sql語句 慢查詢的開啟並捕獲 explain 慢sql分析 show profile查詢sql在mysql伺服器裡面的執行細節和生命週期情況 sql資料庫伺服器的引數調...