MySQL 基礎架構

廖子博發表於2024-10-13

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(掃描行數),就是在每次呼叫儲存引擎介面是累加的。

相關文章