一條SQL語句是怎麼執行的?

2021-09-26 06:06:06 字數 2161 閱讀 5939

大體來說,mysql 可以分為 server 層和儲存引擎層兩部分。

server 層:包括聯結器、查詢快取、分析器、優化器、執行器

儲存引擎層:負責資料的儲存和提取。其架構模式是外掛程式式的,支援 innodb、myisam、memory 等多個儲存引擎。

不同的儲存引擎共用乙個server 層。

聯結器:

負責跟客戶端建立連線、獲取許可權、維持和管理連線。 命令 show processlist 檢視建立的連線狀況

查詢快取

之前執行過的語句及其結果可能會以 key-value 對的形式,被直接快取在記憶體中。但是大多數情況下建議不要使用查詢快取,為什麼呢?因為查詢快取往往弊大於利。

查詢快取的失效非常頻繁,只要有對乙個表的更新,這個表上所有的查詢快取都會被清空。

query_cache_type 設定成 demand,這樣對於預設的 sql 語句都不使用查詢快取。mysql 8.0 版本直接將查詢快取的整塊功能刪掉了。

分析器

「詞法分析:」mysql 需要識別出裡面的字串分別是什麼,代表什麼

「語法分析」:根據語法規則,判斷你輸入的這個 sql 語句是否滿足 mysql 語法

優化器

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

執行器

先判斷一下你對這個表 t 有沒有執行查詢的許可權

1.呼叫 innodb 引擎介面取這個表的第一行,判斷 id 值是不是 10,如果不是則跳過,如果是則將這行存在結果集中;

2.呼叫引擎介面取「下一行」,重複相同的判斷邏輯,直到取到這個表的最後一行。

3.執行器將上述遍歷過程中所有滿足條件的行組成的記錄集作為結果集返回給客戶端。

慢查詢日誌中看到乙個 rows_examined 的字段,表示這個語句執行過程中掃瞄了多少行。在有些場景下,執行器呼叫一次,在引擎內部則掃瞄了多行,因此引擎掃瞄行數跟 rows_examined 並不是完全相的。

mysql> update t set c=c+1 where id=2;
更新流程涉及兩個重要的日誌模組:redo log(重做日誌)和 binlog(歸檔日誌)

重要的日誌模組:redo log

wal的全稱是 write-ahead logging,它的關鍵點就是先寫日誌,再寫磁碟。

crash-safe:即使資料庫發生異常重啟,之前提交的記錄都不會丟失

重要的日誌模組:binlog

innodb 引擎在執行這個簡單的 update 語句時的部流程

將 redo log 的寫入拆成了兩個步驟:prepare 和 commit,這就是"兩階段提交"

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

mysql可以分為server層和儲存引擎層兩部分 一條普通的查詢語是怎樣執行並返回結果了 聯結器查詢快取 大多數情況下建議不要使用查詢快取,查詢快取往往弊大於利。查詢快取的失效非常頻繁,只要有對乙個表的更新,這個表上所有的查詢快取都會被清空。分析器優化器 比如你執行下面這樣的語句,這個語句是執行兩...

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

我們在寫sql的時候crud這些基本的操作想必大家已經是得心應手了,專欄會更傾向於sql優化與執行過程模型的角度重新學習sql,方便大家在做效能優化上更加熟練。select from t where id 10 接下來我們來拆解一下這個sql語句,從中就可以看出sql在mysql中各個模組的執行過程...

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

大體來說,mysql分為 server 層和儲存引擎層,server 層有聯結器 分析器 優化器 執行器和查詢快取 其中,客戶端發出請求與聯結器建立連線並獲取許可權,分析器對sql語句做分析並判斷是否正確 優化器決定使用哪個索引,生成執行計畫,決定多表連線中表的連線順序。執行器執行語句,操作儲存引擎...