一條 SQL 查詢語句是如何執行的?

icecho發表於2020-07-01

\[image:54F48F77-ED36-427B-B12B-4CEE05673D8A-1161-00035BD59A6C27BB/0d2070e8f84c4801adbfa03bda1f98d9.png\]

MySQL 都有哪些零件?

  1. 聯結器:管理連線,許可權驗證。
  2. 分析器:詞法分析,語法分析。
  3. 優化器:執行計劃生成,索引選擇。
  4. 執行器:操作儲存引擎,返回結果。
  5. 儲存引擎:儲存資料,提供讀寫介面。

聯結器

第一步,我們會先連線到 MySQL 資料庫,此時就是連線上聯結器。聯結器負責和客戶建立連線,獲取許可權,維持和管理連線。

mysql -h $ip -u root -p

查詢快取

建立好連線之後,我們就可以使用 SELECT 語句了,執行邏輯就會來到第二步:查詢快取。MySQL 會現在查詢快取看看之前是不是執行過這條語句,如果有就直接返回。在 MySQL 8.0 之後,此模組已被移除。

分析器

如果沒有查詢快取,從這裡 MySQL 就要開始分析我們要幹什麼,需要對我們編寫 SQL 語句進行分析。分析器會先做詞法分析,識別出字串以及它代表的含義。然後再進行語法分析,判斷我們編寫的 SQL 語句有沒有錯誤,如果有錯誤就會丟擲錯誤。

優化器

經過了分析器之後,MySQL 知道你要幹什麼了,此時優化器會根據表結構以及語句目的來決定使用哪個方案。

執行器

MySQL 通過分析器知道了我們要做什麼,通過優化器知道了該怎麼做效率最高。於是就可以進入執行器,真正執行 SQL 語句了。

select * from users where name = ‘operator'

假設 users 表中,name 欄位上沒有建立索引,那麼執行器呼叫 InnoDB 引擎介面取第一行,判斷 name 是不是等於 operator,如不是則跳過,如果是就放在結果集中。然後再呼叫引擎介面取下一行,重複相同的邏輯判斷,直到取到這個表的最後一行。最後將結果集返回給客戶端。

本作品採用《CC 協議》,轉載必須註明作者和本文連結

Hello。

相關文章