MySQL優化器與執行器

2021-10-19 10:02:26 字數 1224 閱讀 7489

經過了分析器,mysql 就知道你要做什麼了。在開始執行之前,還要先經過優化器的處理。

優化器是在表裡面有多個索引的時候,決定使用哪個索引;或者在乙個語句有多表關聯(join)的時候,決定各個表的連線

順序。比如你執行下面這樣的語句,這個語句

是執行兩個表的 join:

mysql> select * from test1 join test2 using(id) where test1.name=yangguo and test2.name=xiaol

ongnv;

既可以先從表 test1 裡面取出 name=yangguo的記錄的 id 值,再根據 id 值關聯到表 test2,再判斷 test2 裡面 name的

值是否等於 yangguo。

也可以先從表 test2 裡面取出 name=xiaolongnv 的記錄的 id 值,再根據 id 值關聯到 test1,再判斷 test1 裡面 name

的值是否等於 yangguo。

這兩種執行方法的邏輯結果是一樣的,但是執行的效率會有不同,而優化器的作用就是決定選擇使用哪乙個方案。優化器階段

完成後,這個語句的執行方案就確定下來了,然後進入執行器階段。如果你還有一些疑問,比如優化器是怎麼選擇索引的,有

沒有可能選擇錯等等。

開始執行的時候,要先判斷一下你對這個表 t 有沒有執行查詢的許可權,如果沒有,就會返回沒有許可權的錯誤,如下所示 (在

工程實現上,如果命中查詢快取,會在查詢快取返回結果的時候,做許可權驗證。查詢也會在優化器之前呼叫 precheck 驗證權

限)。

mysql> select * from test where id=1;
如果有許可權,就開啟表繼續執行。開啟表的時候,執行器就會根據表的引擎定義,去使用這個引擎提供的介面。

比如我們這個例子中的表 test 中,id 字段沒有索引,那麼執行器的執行流程是這樣的:

至此,這個語句就執行完成了。對於有索引的表,執行的邏輯也差不多。第一次呼叫的是「取滿足條件的第一行」這個接

口,之後迴圈取「滿足條件的下一行」這個介面,這些介面都是引擎中已經定義好的。你會在資料庫的慢查詢日誌中看到乙個

rows_examined 的字段,表示這個語句執行過程中掃瞄了多少行。這個值就是在執行器每次呼叫引擎獲取資料行的時候累加

的。在有些場景下,執行器呼叫一次,在引擎內部則掃瞄了多行,因此引擎掃瞄行數跟 rows_examined 並不是完全相同的。

MySQL 優化器執行流程

1.首先就是使用者傳送一條sql通過客戶端接收之後,交由解析器解析sql建立對應的解析樹之後 2.然後優化獲取對應的資料表的資訊 結構 3.獲取表中對應的資料表,首先就會去快取中讀取索引的如果沒有就會通過io讀取在磁碟中記錄索引的資訊並返回 4.選擇合適的索引 因為乙個表會有很多的索引,mysql會...

優化器執行過程與分析

三 總結 查詢在長沙的女性vip顧客 sql語句 select from customers1s where city 長沙 and gender 0 開啟trace檢視優化器 set optimizer trace enabled on 開啟trace檢視優化器的結果 set end marker...

MySQL優化 MySQL伺服器優化與破解密碼

1.四種字符集問題 my.ini 設定一下三個 default character set utf8 建議連線字符集改為utf8 character set server utf8 設定伺服器字符集 collation server utf8 general ci 校驗字符集2.slow log慢查...