首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL 性能分析利器:EXPLAIN 詳解與優化實戰

     編輯:MySQL 資料庫相關知識

1. EXPLAIN 基本用法

EXPLAIN SELECT * FROM test1 WHERE id = 1;

輸出欄位:id、select_type、table、type、possible_keys、key、key_len、ref、rows、Extra。

2. 關鍵欄位解讀

欄位含義優化重點
type訪問類型,性能由好到差:
system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL
至少達到 range,最好 ref 或 const
possible_keys查詢可能用到的索引為空則需檢查 WHERE 條件列是否建立索引
key實際使用的索引為 NULL 表示未用索引
key_len使用索引的長度推斷複合索引實際用了哪幾列
rows預估掃描行數(InnoDB 不準)越小越好
Extra額外信息Using index 覆蓋索引好;Using filesort/Using temporary 需優化

3. 組合索引與最左前綴原則

假設組合索引 (key1, key2, key3):

  • WHERE key1 = ... ✅ 用到索引
  • WHERE key1 = 1 AND key2 = 2 ✅
  • WHERE key1 = 3 AND key3 = 3 AND key2 = 2 ✅(順序無關,優化器會調整)
  • WHERE key2 = 1 ❌ 非最左列,無法用到組合索引

ORDER BY key3 若未在索引中,會出現 Using filesort。

4. 慢查詢日誌配置與分析

[mysqld]
long_query_time = 1
log-slow-queries = /var/log/mysql/slow.log

可用 mysqlsla 或 mysqlreport 分析 SELECT/UPDATE/INSERT 佔比。

5. MyISAM vs InnoDB 鎖機制

  • MyISAM:表級鎖。大量 UPDATE 時 SELECT 會被阻塞,需等所有 UPDATE 完成。
  • InnoDB:行級鎖。並發性能優,無上述問題。

6. InnoDB 事務刷盤配置

參數值行為適用場景
1提交時立即將 redo log 寫入磁盤並 fsync最高安全,性能稍低
0提交不寫盤,每秒背景線程 fsync 一次高性能,可能丟 1 秒數據
2提交寫入 OS cache,每秒 fsync 到磁盤折中,掛機可能丟數據

配置:innodb_flush_log_at_trx_commit = 1(推薦生產環境)。

7. EXPLAIN 實戰範例

mysql> EXPLAIN SELECT * FROM event;
+----+-------------+-------+------+---------------+------+---------+------+------+-------+
| id | select_type | table | type | possible_keys | key  | key_len | ref  | rows | Extra |
+----+-------------+-------+------+---------------+------+---------+------+------+-------+
|  1 | SIMPLE      | event | ALL  | NULL          | NULL | NULL    | NULL |   13 |       |
+----+-------------+-------+------+---------------+------+---------+------+------+-------+

type=ALL 表示全表掃描,需加索引優化。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved