SQL的生命週期

龍山游龍發表於2021-09-01

一、SQL工作流程

一個使用者建立連線,就會分配一個執行緒,同時分配一個工作區(sort_buffer_size=256k),然後執行SQL語句,同時將查詢結果扔到工作區進行排序,然後返回給使用者。期間這個查詢結果的時候,如果結果在記憶體中則直接從記憶體中獲取,如果不在,就先從磁碟獲取到記憶體,然後扔給工作區,返回結果給使用者,接著關閉執行緒,關閉連線。

二、MySQL各個元件的作用

MySQL 體系結構

2.1 connectors

主要負責連線管理、授權認證、安全等等。每個客戶端連線都對應著伺服器上的一個執行緒。伺服器上維護了一個執行緒池,避免為每個連線都建立銷燬一個執行緒。當客戶端連線到MySQL伺服器時,伺服器對其進行認證。可以通過使用者名稱與密碼認證,也可以通過SSL證書進行認證。登入認證後,伺服器還會驗證客戶端是否有執行某個查詢的操作許可權。這一層並不是MySQL所特有的技術。

2.2 服務和工具

管理服務和工具元件:系統管理和控制工具,例如備份恢復、Mysql複製、叢集等 

sql介面:接受使用者的SQL命令,並且返回使用者需要查詢的結果

查詢解析器:SQL命令傳遞到解析器的時候會被解析器驗證和解析(許可權、語法結構)

查詢優化器:SQL語句在查詢之前會使用查詢優化器對查詢進行優化

快取:如果查詢快取有命中的查詢結果,查詢語句就可以直接去查詢快取中取資料

插入式儲存引擎:儲存引擎說白了就是如何管理運算元據(儲存資料、如何更新、查詢資料等)的一種方法。因為在關聯式資料庫中資料的儲存是以表的形式儲存的,所以儲存引擎也可以稱為表型別(即儲存和操作此表的型別)

2.3 儲存引擎層

負責MySQL中資料的儲存與提取。 伺服器中的查詢執行引擎通過API與儲存引擎進行通訊,通過介面遮蔽了不同儲存引擎之間的差異。

2.4 系統檔案層

 該層主要是將資料庫的資料儲存在檔案系統之上,並完成與儲存引擎的互動。

三、詳細的SQL工作流程

1、 使用者連線進來以後,系統會分分配一個執行緒,同時分配一個工作區sort_buffer;

2、 通過SQL介面傳入,如果該SQL在查詢快取中有,直接返回結果,沒有,就對SQL進行優化,選擇一個較優計劃,然後傳入儲存引擎層繼續;如果要獲取的資料在記憶體中,就從記憶體中獲取資料;

3、 如果不在記憶體,就去磁碟獲取資料傳入記憶體(innodb_buffer_pool);

4、 然後修改資料頁;

5、 修改資料產生的redo log寫入log_buffer;

6、 修改完成,commit提交,log_buffer  寫入logfile,commit後永久有效;

7、 這個時候系統就會告訴使用者已經寫入成功了,但實際上髒頁並沒有寫入磁碟,因為redo已經寫入,所以不用擔心資料丟失,之後通過寫執行緒慢慢寫入磁碟,此時的物理讀不計算在SQL執行時間裡。


本文參考《MySQL技術內幕InnoDB儲存引擎》

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/30310891/viewspace-2789838/,如需轉載,請註明出處,否則將追究法律責任。

相關文章