變量族群含義
SHOW SESSION/GLOBAL STATUS LIKE 'Handler_read%' 反映存儲引擎層讀取行的方式與次數,是 EXPLAIN 之外的微觀執行證據。
六大核心指標詳解
| 變量 | 含義 | 典型觸發場景 | 優化方向 |
Handler_read_first | 讀索引第一條記錄 | 全索引掃描 SELECT col FROM tbl (col 有索引) | 大表避免全索引掃,加 WHERE 限制範圍 |
Handler_read_key | 根據鍵值讀取行 | 索引點查/範圍查 WHERE idx_col = 1 | 越高越好,說明索引命中率高 |
Handler_read_next | 按索引順序讀下一行 | 索引範圍掃描 WHERE idx_col > 10、ORDER BY idx_col ASC | 配合 read_key 觀察範圍掃描行數 |
Handler_read_prev | 按索引逆序讀上一行 | ORDER BY idx_col DESC | 同 read_next,優化器自動選擇 |
Handler_read_rnd | 根據固定位置讀行 | 文件排序 ORDER BY non_idx_col、臨時表讀取 | 越大越差,優化索引消除 filesort |
Handler_read_rnd_next | 按數據文件順序讀下一行 | 全表掃描 SELECT * FROM tbl、無索引 WHERE | 核心紅旗指標,> 0 即需檢查索引 |
實戰測試模板
-- 1. 重置會話計數器
FLUSH STATUS;
-- 2. 執行目標 SQL
SELECT * FROM tbl WHERE idx_col = 5;
-- 3. 觀察 Handler_read
SHOW SESSION STATUS LIKE 'Handler_read%';
-- 4. 對照 EXPLAIN
EXPLAIN SELECT * FROM tbl WHERE idx_col = 5;
典型場景對照表
| SQL 模式 | EXPLAIN type | Handler_read 關鍵特徵 |
SELECT idx_col FROM tbl | index | first=1, next=N (全索引掃) |
SELECT * FROM tbl WHERE idx_col=5 | ref | key=1, next=1 (點查+回表) |
SELECT * FROM tbl WHERE idx_col>5 | range | key=1, next=M (範圍掃描) |
SELECT * FROM tbl ORDER BY idx_col | index | first=1, next=N (有序索引掃) |
SELECT * FROM tbl ORDER BY idx_col DESC | index | prev=N (逆序掃描) |
SELECT * FROM tbl ORDER BY non_idx | ALL + filesort | rnd=N, rnd_next=N (全表掃+排序) |
SELECT * FROM tbl | ALL | rnd_next=N (純全表掃) |
優化決策樹
- Handler_read_rnd_next > 0 → 存在全表掃描 → 檢查 WHERE/JOIN/ORDER BY 列是否有索引
- Handler_read_rnd > 0 → 存在 filesort → 加索引覆蓋 ORDER BY/GROUP BY,或增大
sort_buffer_size
- Handler_read_key 低、read_next 高 → 範圍掃描行數大 → 縮小範圍、增加過濾條件、分區表
- Handler_read_first > 0 且無 WHERE → 全索引掃描 → 業務是否需要全量導出?否則加 LIMIT/WHERE
進階組合指標
- 索引命中率 =
Handler_read_key / (Handler_read_key + Handler_read_rnd_next)
- 回表率 =
Handler_read_rnd / Handler_read_key (近似,受 MRR 影響)
- 排序開銷 =
Handler_read_rnd / Com_select
版本差異提示
- MySQL 5.6+:引入 MRR (Multi-Range Read),
Handler_read_rnd 可能減少
- MySQL 8.0:Hash Join、並行查詢可能改變計數語義,建議結合
EXPLAIN ANALYZE (8.0.18+)
- InnoDB vs MyISAM:計數邏輯一致,但 InnoDB 含 change buffer 合併操作可能影響瞬時值