mysql執行語句 mysql執行sql語句過程

2021-10-25 14:05:55 字數 2192 閱讀 1315

流程概述

mysql得到sql語句後,大概流程如下:

1.sql的解析器:負責解析和**sql

2.預處理器:對解析後的sql樹進行驗證

3.查詢優化器:得到乙個執行計畫

4.查詢執行引擎:得到資料結果集

5.將資料放回給呼叫端。

流程圖如下所示:

分發器及快取階段

首先,如果系統的快取功能開啟著的話,sql語句進入mysql後,sql進行判斷,是否為select關鍵字。如果是,那麼先去查詢快取中進行查詢,如果在查詢快取中可以命中sql語句,那麼直接返回查詢快取中的查詢語句對應的value值(在快取中,把查詢語句做乙個hash運算,結果作為key值,查詢的結果集為value)。

如果命中快取的話,查詢速度是相當快的。但是查詢快取也有它相應的缺點。

首先,開啟快取的話,伺服器會消耗大量的記憶體空間;其次,快取有的時候並不適用;最後,有的情況下,開啟快取也不會將對應的sql語句寫入快取。

快取不適用的情況:

快取的鎖的力度比較大,而且對於動態sql的支援度不夠。

快取在資料進行更新的時候,是進行的表級鎖,更新結束後,會把所有與更新內容相關的快取全部刪除。所以,如果表的寫入比較多的話,快取是比較浪費效能的。如果寫入特別多,可能快取反而會導致mysql變慢。

查詢不到快取的情況:

1.查詢條件有不確定資料:如now ,current_time等。

2.快取對大小寫敏感,如select * from test 和select* from test 就不會解析為同一條sql

查詢帶來的額外開銷:

1.開始前需要先檢查快取是否命中。

2.結果輸出的時候,需要額外進行資料的快取操作。

3.寫入資料時,mysql會將對應表的所有快取都設定為失效。當快取記憶體較大的時候,會導致系統消耗較大。

sql的解析器與預處理

sql解析器是在命令分發之後,將對應的sql語句,解析為sql解析樹。sql解析樹是mysql本身內部的語法規則和解析查詢。驗證是否使用錯誤的關鍵字,sql語法順序是否正確等。(語法層面的錯誤)

解析完成後,進行查詢語句預處理器,根據mysql的規則,檢查解析樹是否合法。(**是否存在,別名是否有歧義等)

查詢優化器

查詢優化器獲取到執行計畫然後由查詢執行引擎執行相應的操作。查詢優化器,是資料庫l的乙個核心模組,分為cbo和rbo兩種。

其中,rbo是基於規則的優化器。(rbo在oracle早期版本中使用,現在也保留,不過預設為cbo。mysql沒有rbo優化器)

這些規則是硬編碼在資料庫的**中的。rbo會根據輸入的sql語句可以匹配到的優先順序最高的規則去作為執行計畫。例如:在rbo中有這麼一條規則:有索引的情況下,使用索引。那麼所有的帶有索引的表在執行的時候,都會走索引。rbo最大的問題在於,通過固定規則來決定執行計畫。並不會考慮sql中涉及的物件的數量和分布。有可能選出來的規則不是最優的執行計畫。

cbo 是基於成本的優化器(基於統計資訊),從目標諸多的執行路徑中選擇乙個成本最小的執行路徑來作為執行計畫。成本指的是mysql根據相關的統計資訊,算出來sql語句對應的io,cpu等的消耗的乙個估計值。計算過程涉及到索引、表、行等資料,過程比較複雜。

1.查詢優化器使用統計資訊為sql選擇執行計畫。

2.mysql沒有資料直方圖,也無法手工刪除統計資訊。(oracle有)

3.在伺服器曾有查詢優化器,卻沒有儲存資料和索引統計資訊。統計資訊由儲存引擎實現,不同的儲存引擎會儲存不同的統計資訊。

4.統計資訊分為索引的統計資訊和表的統計資訊。

檢視統計資訊

索引統計資訊

show index from table 或information_schema.statistics表

表統計資訊

show table status like 或 information_schema.tables表

查詢執行引擎+返回資料給客戶端

得到執行計畫後,根據已有的執行計畫,查詢執行引擎,mysql的sql layer層,呼叫storage engine layer層的介面,從mysql的儲存引擎中獲取到相對應的結果集,然後返回給使用者。

執行完成後,將結果返回給客戶端,如果是查詢語句,並且開啟了快取,那麼,mysql會同時將結果集放到查詢快取中。然後將查到的結果集返回。如果是增刪改操作,那麼返回執行語句後受影響的行數。

mysql的語句執行過程 Mysql語句執行過程

昨天老大問了我個問題,說一條 在低層的時候是怎麼執行的,發生了什麼 首先使用者通過各種鏈結連線到我們的 伺服器 但是這些鏈結需要等待伺服器的空閒程序來處理 所以當伺服器接到一條 後會做很多分解動作 首先在快取裡查詢快取中是否有需要的資料表,如果有並且可以用那麼就不執行後面的動作了,直接返回給使用者 ...

mysql 語句在哪執行 MySQL語句執行過程

平常我們看到的只是一條語句執行出來的結果,並不知道中間發生了什麼,今天就來 一下,mysql語句的執行過程。1.聯結器 每次使用mysql會先連線到資料庫上面,聯結器負責跟客戶端進行連線 mysql u root p 然後根據密碼,判斷我登陸進去會有什麼許可權,並分配許可權給我 通過 show pr...

mysql查詢計畫語句 mysql語句及執行計畫

mysql uroot p mysql h10.0.0.100 uuser password show databases insert into user select id 3333504 user name password birthday mobile email province cit...