SQL語句執行流程


1. 客戶端執行sql語句 (在此之前會先進行用戶名密碼的連接,會去進行mysql的校驗,詳情查看mysql運行流程)

2.sql語句會進入到命令分發器

2. sql語句在進行mysql服務器進行查詢緩存,查詢以sql語句作為記錄,以語句作為key,結果作為value

    假如當前的查詢語句為“select count(*) from table_name” , 開啟查詢緩存后,回去查詢當前這條語句是否存在,存在檢查用戶是否有權限訪問內容(類似rbac操作),有權限返回結果(如果語句內有空格,匹配不上,會導致查詢緩存失效)

3. 命令解析器,會對sql語句進行解析,生成一個解析樹,判斷你是什么類型的操作(查詢優化器select ,表變更(增刪改)dml,表維護ddl,復制模塊rep,狀態模塊status)

4. 假如你是一條“select count(*) from table_name where id=1 and age > 10” 這樣的操作,查詢優化器會將“where id=1 and age > 10”條件取出來,根據自己的規則算法匹配查詢,存在一個掃描區,會一直對磁盤進行掃描,找到對應的磁盤頁數據內容

5. 返回數據

 

sql優化,指的也就是對磁盤的i/o操作次數和優化器的執行時間,不是i/o的操作速度(充錢解決)

 

解析器:分為句法掃描器,與語法規則模塊

句法掃描器 =》整個查詢語句分為多個令牌(一些不可分隔的元素,列名)

“select count(*) from table_name where id=1 and age > 10”

如上面的sql, 句法解析器將每個字節流都會分解為一個令牌

select
count
(
*
)
from
table_name
where
id
=
1
and
age
>
10

 語法規則(sql.yacc.yy)然后根據這些令牌sql.lex.h -> 關鍵字->生成解析樹

 

 優化器:

 

1. 會選擇合適的鍵,比如使用join的時候,會選擇適合查找的鍵

2. 針對每個表進行全局掃描,如果數據量過大,速度會慢

3. 如果是join查詢,選擇表的連接順序

4. 對於where進行重寫 ,刪除不必要的代碼,減少不必要的計算量,盡可能的限制條件,方便查詢有效率執行

   (join)刪除不需要連接的數據表

5. order group 確定是否可以使用到索引

 (join)合並大的視圖

6. 執行執行計划

 

個人理解

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM