MySQL 優化是系統工程,涵蓋邏輯設計、物理設計、執行計畫、實例配置、作業系統與硬體。本文整理八大維度檢查清單,並附贈狀態監控、慢查詢配置、EXPLAIN 分析、慢查詢日誌啟用等實操技巧。
max_connections、innodb_buffer_pool_size、query_cache(5.7+ 建議關閉)、thread_pool。OPTIMIZE TABLE 整理碎片(MyISAM)、統計資訊更新 ANALYZE TABLE。SHOW STATUS LIKE 'Uptime'; -- 運行時間 SHOW STATUS LIKE 'Com_select'; -- SELECT 次數 SHOW STATUS LIKE 'Com_insert'; -- INSERT 次數 SHOW STATUS LIKE 'Com_update'; -- UPDATE 次數 SHOW STATUS LIKE 'Com_delete'; -- DELETE 次數 SHOW STATUS LIKE 'Connections'; -- 總連線數 SHOW STATUS LIKE 'Slow_queries'; -- 慢查詢次數 -- 會話級 vs 全域級 SHOW SESSION STATUS LIKE '...'; -- 當前連線 SHOW GLOBAL STATUS LIKE '...'; -- 啟動至今
SHOW VARIABLES LIKE 'long_query_time'; -- 顯示預設 10 秒 SET GLOBAL long_query_time = 1; -- 即時生效,無需重啟 -- 永久生效需寫入 my.cnf: long_query_time = 1
DELIMITER $$
EXPLAIN SELECT * FROM orders WHERE user_id=100 AND status=1;
重點欄位:type(ALL/index/range/ref/eq_ref/const/system)、key(實際用到的索引)、rows(預估掃描行數)、Extra(Using where/Using index/Using temporary/Using filesort)。
MySQL 5.5+ (my.cnf):
[mysqld] slow_query_log = 1 slow_query_log_file = /var/log/mysql/slow.log long_query_time = 1 log_queries_not_using_indexes = 1
舊版 (5.0/5.1) 啟動參數:
mysqld --log-slow-queries=/var/log/mysql/slow.log
日誌預設存放於 datadir,可用 pt-query-digest 分析 Top SQL。
EXPLAIN 分析執行計畫,確認是否走索引、是否全表掃描。SELECT *、LIKE '%...'、隱式轉換)。query_cache 在高併發寫入場景下常成熱點,5.7 建議關閉,8.0 已移除。ALTER TABLE 鎖表久,用 pt-online-schema-change 或 8.0 Instant DDL。WHERE id > last_id LIMIT 20 替代 OFFSET。