EXPLAIN SELECT * FROM test1 WHERE id = 1;
輸出欄位:id、select_type、table、type、possible_keys、key、key_len、ref、rows、Extra。
| 欄位 | 含義 | 優化重點 |
|---|---|---|
| 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 需優化 |
假設組合索引 (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。
[mysqld] long_query_time = 1 log-slow-queries = /var/log/mysql/slow.log
可用 mysqlsla 或 mysqlreport 分析 SELECT/UPDATE/INSERT 佔比。
| 參數值 | 行為 | 適用場景 |
|---|---|---|
| 1 | 提交時立即將 redo log 寫入磁盤並 fsync | 最高安全,性能稍低 |
| 0 | 提交不寫盤,每秒背景線程 fsync 一次 | 高性能,可能丟 1 秒數據 |
| 2 | 提交寫入 OS cache,每秒 fsync 到磁盤 | 折中,掛機可能丟數據 |
配置:innodb_flush_log_at_trx_commit = 1(推薦生產環境)。
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 表示全表掃描,需加索引優化。