MYSQL 一條sql的執行過程

2022-09-13 06:06:13 字數 1717 閱讀 6885

1、sql介面,負責接收處理收到的sql語句。

2、查詢解析器,負責對sql語句進行解析,讓mysql能看懂sql語句,按照sql語法解析出這條sql要幹啥。

3、查詢優化器,選擇最優的查詢路徑,指定執行計畫(全表掃瞄還是走索引)

4、呼叫儲存引擎介面真正開始執行sql語句。

儲存引擎就是用來執行sql的,在mysql中,sql介面、sql解析器、查詢優化器都是通用的,但是儲存引擎不是,可以選擇不同的儲存引擎來執行sql,一般用innodb。

innodb儲存引擎中有乙個非常重要的元件叫緩衝池(buffer pool) 。如當更新一條資料時innodb會根據更新條件查詢這條資料是否在緩衝池裡,如果在就不再去磁碟載入。如果不在會從磁碟載入到緩衝池中,並對這條資料加獨佔鎖。

之後,會將更新前的這條資料記錄到乙個日誌檔案裡,這個檔案就是undo日誌檔案 。 可用於資料的回滾。

當把要更新的資料從磁碟載入到緩衝池並對其加了獨佔鎖之後就可以在緩衝池中對其進行修改了,修改後的資料因為還沒有重新整理到磁碟所以這個時候稱其為髒資料。

有undo buffer的,寫undo log前,會先放在記憶體buffer中,在重新整理redo log之前寫入到磁碟上的undo tablespace中。

當緩衝池中的資料修改完之後,還沒刷到磁碟。如果此時資料庫宕機就會導致更新後的資料丟失。

此時需要把修改的資料記錄下來,redo日誌就是記錄修改後的資料的。redo log buffer也是乙個緩衝區,用來儲存redo日誌檔案。可以在資料庫宕機後用來恢復更新後的資料。當事務提交的時候可以選擇將redo日誌寫入到磁碟中。(在沒提交事務時就算資料丟掉了也沒關係,因為事務沒提交sql執行不成功)

當事務提交時可以通過innodb_flush_log_at_trx_commit配置redo日誌刷盤的策略。

1、當這個引數時0時,事務提交的時候不會將redo日誌重新整理到磁碟,這時如果宕機資料是會丟失的。

2、當這個引數是1時,事務提交時就會將redo log從記憶體刷入到磁碟,是要事務提交了redo log就一定在磁碟了。可以防止資料的丟失。

3、當這個引數是2時,事務提交後會將redo log寫入磁碟檔案對應的os cache中去,不會直接刷到磁碟,可能過了一秒才會os cache裡的資料刷入到磁碟。有丟資料的風險。

所以,一般選擇將innodb_flush_log_at_trx_commit設定為1。redo log是innodb儲存引擎特有的。

binlog不是innodb特有的日誌檔案,而是mysql service 自己的日誌檔案。 記錄的也是修改後的資料。當事務提交redo log刷盤之後也會同步將binlog也刷入當磁碟中。

binlog也有自己的刷盤策略,通過sync_binlog引數配置。該引數預設是0,此時會先將binlog放到os cache中。有資料丟失的風險。當該引數配置成1時,會直接刷入到磁碟。當把binlog寫入磁碟檔案之後事務提交就完成了,這時會將修改對應的binlog檔名以及檔案的位置都寫入到redo log日誌檔案裡,還會在redo log日誌檔案裡寫入commit標記。

用於判定事務是否提交成功,如果在redo log寫入commit之前的任意步驟資料庫宕機了都不能說事務提交成功。除此之外也用於保證redo log日誌檔案和binlog日誌檔案的一致性。

之後,後台io執行緒會隨機的將記憶體中的髒資料重新整理到磁碟中。

innodb儲存引擎主要包含了buffer pool、redo log buffer及裡面的資料,還有undo日誌檔案、redo日誌檔案等。

MySQL中一條SQL語句的執行過程

查詢語句的執行順序 客戶端通過tcp連線傳送連線請求到mysql聯結器,聯結器會對該請求進行許可權驗證及連線資源分配 max connections,8小時超時 建立連線後客戶端傳送一條語句,mysql收到該語句後,通過命令分發器判斷其是否是一條select語句,如果是,在開啟查詢快取的情況下,先在...

mysql中,一條查詢sql的執行過程

作為乙個程式設計師,最不能避免的就是與sql打交道,那麼,在我們平時寫的那麼多sql它們是怎麼執行,並給我們返回資料的?比如最簡單的乙個查詢 select from user where id 10 sql簡單,但問題是你知道它是如何執行的嗎?先從整體看一下mysql資料庫的執行構造 1 serve...

一條SQL語句的執行過程

1.1連線層 提供連線協議 tcp ip,socket 提供驗證 使用者 密碼 ip socket 提供專用連線線程 接收使用者sql,返回結果 通過以下語句可以檢視鏈結執行緒的基本情況 mysql show processlist 1.2sql層 重點 接收上層傳送的sql語句 語法驗證模組 驗證...