mysql關聯查詢優化器
目錄
一、關聯查詢的含義
mysql的關聯查詢:總是從一個表開始一直嵌套循環、回溯完成所有表關聯,是一個左側深度優化的樹。
二、關聯查詢優化器
它決定了多個表關聯時的順序,通常多表 關聯的時候,可以 有多種不同的關聯順序來獲得相結果的執行結果。 關聯查詢 優化器通過 評估不同順序時的成本來選擇一個代價最小的關聯 順序。
三、舉例
這是一條普通的關聯查詢,用explain來得到他們表執行關聯的順序,會得到跟我們上面分析的順序不一樣。
explain select film.film_id, file,title, actor.actor_id, actor.firest_name from film inner join film_actor using(film_id)
inner join actor using(actor_id);
優化器選擇的關聯順序是會讓查詢進行更少的嵌套循環和回溯操作。不過有時候,優化器給出的並不是最優的關聯順序徐。這時可以使用 STRAGHT_JOIN 關鍵字重寫查詢,讓優化器按照你認爲的最優的關聯順序執行。
explain select STRAGHT_JOIN film.film_id, file,title, actor.actor_id, actor.firest_name from film inner join
film_actor using(film_id) inner join actor using(actor_id);
用下面的命令查看關聯順序的預估成本。
show status like 'last_query_cost';
四、貪婪模式
不過糟糕的是,如果有超過n個表的關聯,那麼需要檢查n的階乘種關聯順序,稱爲執行計劃的“搜索空間”。若是10個表的關聯,那麼共有3628800種不同的關聯順序。這時,優化器會選擇使用“貪婪”搜索的方式查找“最優”的關聯順序。當關聯的表超過 optimizer_search_depth的限制時,就會選擇“貪婪”搜索模式。