和很多其他關係型資料庫不通,mysql並不會在生成查詢位元組碼來執行查詢。mysql生成查詢的一棵指令樹,然後通過儲存引擎執行完成這棵指令樹並返回結果。最終的執行計畫包含了重構查詢的全部資訊。如果某個查詢執行explain extended 之後,在執行show warnings,就可以看到重構出的查詢。
在電腦科學中,這被稱作是一科平和數。但是,這並不是mysql執行查詢的方式。正如我們前面章節介紹的,mysql總是從乙個表開始一直巢狀迴圈、回溯完成所有表關聯。所以,mysql的執行計畫是乙個左側深度優先的樹。
關聯查詢優化器
mysql優化器最主要的一部分就是關聯查詢優化,它決定了多個表關聯時的順序。通常多表關聯的時候,可以有多重不同的關聯順序來獲得相同的執行結果。關聯查詢優化器則通過評估不同的順序時的成本來選擇乙個代價最小的關聯順序。
新的查詢通過不同順序的關聯後都可以獲得相同的結果:
select film.film_id ,film.title,film.release_year,actor.actor_id ,actor.first_name ,actor.last_name from film inner join film_actor using (film_id)
inner join actor using(actor_id).
容易看出,可以通過一些不同的執行計畫來完成上面的查詢。例如:mysql可以從film表開始,使用film_actor 表的索引film_id來查詢對應的actor_id的值,然後再跟進actor表的主鍵找到對應的記錄。oracle使用者會用下面的術語描述:film表作為驅動表現查詢film_actor表,然後以此結果為驅動表在查詢actor表。這樣的效率應該會不錯。我們再使用explain 看看mysql如何執行這個查詢。。。
這和我嗎前面給出的執行計畫完全不同。mysql從actor表開始,然後與我們前面的計畫按照相反的順序進行關聯。這樣做是否效率更高呢?我們來看看,先使用straight_join 關鍵字,按照我們之前的順序執行,
explain select straight_join film.film_id....
我們來分析一下為什麼mysql會將關聯順序倒轉過來:可以看出,關聯順序倒轉過來之後的第乙個關聯表只需要掃瞄很少的行數。在兩種關聯順序之下,第二個和第三個關聯表都是根據索引查詢的,速度都很快,不同的是需要掃瞄的索引項的數量不同:
·將film表作為第乙個關聯表時,會找到951條記錄,然後對film_actor 表和actor表畸形巢狀迴圈查詢。
·如果mysql選擇首先掃瞄actor表,只會返回200條記錄然後進行後面的巢狀迴圈查詢。
換句話說,倒轉關聯順序會讓查詢進行跟梢的巢狀迴圈和回溯操作。為了驗證優化器的選擇是否正確,我們單獨執行者戀歌查詢,並且看看對應的last_query_cost 狀態值。我們看到倒轉的關聯順序的預估成本是241,而原來的查詢的預估成本是1154.
這個簡單的例子主要想說明mysql是如何選擇合適的關聯順序讓查詢執行的成本盡可能低的。重新定義關聯表的順序是優化器非常重要的一部分功能。不過有的時候,優化器可能給出的不是最優的關聯順序。這是可以使用straight_join關鍵字重寫查詢,讓優化器按照你認為最優的關聯順序執行--不過老實說,人的判斷很難那麼精緻,絕大多數的時候,優化器做出的選擇都比普通人判斷的更要準確。
關聯優化器會嘗試在所有關聯順序中選擇乙個成本最小的來生成執行計畫樹。如果可能優化器會遍歷每乙個表,然後逐個做迴圈巢狀計算每一刻可能的執行計畫樹的成本,最後返回乙個最優的執行計畫。
不過糟糕的是,如果有超過n給表的關聯,那麼需要堅持n的階乘中關聯順序,我們稱之為所有可能的執行計畫的「搜尋空間」 ,搜尋空間的增長速度非常快--例如,若是有10個表的關聯,那麼共有362800種可能不同的關聯順序,當搜尋空間非常大的時候,優化器不可能逐一評估每一種關聯順序的成本。實際上,當需要關聯的表超過optimizer_search_depth的限制的時候,就會攥著「貪婪」搜尋模式了。
在mysql這些年的發展過程中,積累了很多啟發式的優化策略來假設執行計畫的生成,絕大多數情況下,這都是有效的,以為不會計算每一種關聯順序的成本,索引偶爾也會選擇乙個不是最優的執行計畫。
有時,各個查詢的順序不能隨意安排,這是關聯優化器可以根據這些規則大大減少索引空間,例如,左連線,相關子查詢。這是因為,後面的表的查詢需要依賴於前面表的查詢結果。這種依賴關係通常可以幫助優化器大大減少需要掃瞄的執行計畫數量。
mysql 生成執行計畫 MySQL的執行計畫
mysql的執行計畫 什麼是執行計畫?執行計畫通常是開發者優化sql語句的第一步。mysql在解析sql語句時,會生成多套執行方案,然後內部會進行乙個成本的計算,然後通過優化器選擇乙個最優的方案執行,然後根據這個方案會生成乙個執行計畫。開發者通過檢視sql語句的執行計畫,可以直觀的了解到mysql是...
mysql執行計畫 MySQL 執行計畫
1.執行計畫的定義 什麼是執行計畫 查詢計畫 呢?執行計畫就是一系列的操作步驟。sql是宣告性語言,它只告訴資料庫要查詢什麼,但並不告訴資料庫如何去查。資料庫所要做的就是基於演算法和統計資訊計算出一條最佳的訪問路徑。這個工作是由優化器來完成的。優化器會比較不同的執行計畫,然後選擇其中最優的一套。2....
mysql 查詢執行計畫 MySql執行計畫的檢視
一。什麼是資料庫執行計畫 利用乙個sql語句,你可能要server取出所有news表中的資訊.當server收到的這條sql的時候,第一件事情並不是解析它.如果這條sql沒有語法錯誤,server才會繼續工作.server會決定最好的計算方式.server會選擇,是讀整個news表好呢,還是利用索引...