MySQL 基礎架構:一條SQL查詢語句如何執行
- 聯結器(管理連線、許可權驗證)
- 查詢快取(5.7不推薦使用,8.0完全廢棄)
- 解析器(解析樹)
- 最佳化器(索引選擇、表關聯順序、執行計劃)
- 執行器(呼叫儲存引擎介面)
- 執行引擎(InnoDB、MyISAM、Memory)
MySQL 分成Server層和儲存引擎層兩部分。
聯結器
mysql -h<ip> -P<port> -u<user> -p
建立連線後,聯結器會查詢許可權表。
- 如果使用
GRANT
/REVOKE
修改使用者許可權,許可權會立即生效 - 如果直接更新許可權表,需要使用
FLUSH PRIVILEGES
或重新登入,許可權才會生效
檢視連線狀態;預設連線空閒超過8小時會自動斷開(由 wait_time
引數控制),斷開後查詢會收到 lost connection
錯誤
show processlist
長連線/短連線:在應用中應該儘量使用長連線,避免頻繁建立斷開連線的開銷。
但是查詢執行過程臨時使用的記憶體是由連線物件管理的,所以長連線可能會佔用大量記憶體問題
- 定期斷開連線或執行大查詢後斷開連線
- MySQL 5.7 後可以透過 mysql_reset_connection 重新初始化資源,但不會重連和重做許可權校驗
查詢快取
快取失效:只要對錶進行更新,表上的所有查詢快取都會被清空。
按需使用快取,設定引數 query_cache_type=demand
後查詢預設不進行快取,使用快取需要顯示指定 SQL_CACHE
select sql_cache * from table
MySQL 8.0 移除查詢快取功能
分析器
分析器:進行詞法分析和語法分析,生成解析樹。
最佳化器
最佳化器:索引選擇、表關聯順序、生成執行計劃
檢視執行計劃
explain select * from table
執行器
解析器執行後會校驗使用者有沒有表許可權(precheck),執行器在執行時會在此之前校驗使用者有沒有表許可權(觸發器、儲存過程等一些在執行時涉及的表)
慢日誌中的 rows_examined(掃描行數),就是在每次呼叫儲存引擎介面是累加的。