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. 執行執行計划
個人理解