深入理解 MySQL EXPLAIN 的七種 type 類型
掌握 MySQL 的 EXPLAIN 命令是數(shù)據(jù)庫(kù)性能優(yōu)化的必備技能,而其中的 type 字段更是分析查詢性能的關(guān)鍵指標(biāo)。
本文將帶你深入理解七種 type 類型的含義、使用場(chǎng)景和優(yōu)化策略。
一、什么是 EXPLAIN 的 type 字段?
在 MySQL 中,EXPLAIN
命令用于分析 SQL 查詢的執(zhí)行計(jì)劃。其中的 type
字段表示 MySQL 決定如何查找表中的行,它直接反映了查詢的性能特征。
理解不同類型的訪問(wèn)方式,對(duì)于 SQL 優(yōu)化至關(guān)重要。
二、七種 type 類型詳解
1. system ★★
★★★(最優(yōu))
特點(diǎn):
示例場(chǎng)景:
-- 查詢系統(tǒng)表中的單行數(shù)據(jù)
EXPLAIN SELECT * FROM mysql.proxies_priv WHERE user = 'root';
輸出特征:
優(yōu)化建議:這已經(jīng)是最高效的訪問(wèn)方式,無(wú)需進(jìn)一步優(yōu)化。
2. const ★★★★★
特點(diǎn):
通過(guò)主鍵或唯一索引的等值查詢
最多返回一條記錄
查詢條件必須是常量值
示例場(chǎng)景:
-- 主鍵等值查詢
EXPLAIN SELECT * FROM users WHERE id = 1;
-- 唯一索引等值查詢
EXPLAIN SELECT * FROM users WHERE email = 'user@example.com';
輸出特征:
type: const
rows: 1
key: 使用的索引名
優(yōu)化建議:確保查詢使用主鍵或唯一索引,這是理想的查詢方式。
3. eq_ref ★★★★☆
特點(diǎn):
示例場(chǎng)景:
-- orders.user_id 是 users.id 的外鍵,且 users.id 是主鍵
EXPLAIN SELECT * FROM orders JOIN users ON orders.user_id = users.id;
輸出特征:
優(yōu)化建議:確保連接條件使用主鍵或唯一索引,檢查外鍵關(guān)系是否正確建立。
4. ref ★★★☆☆
特點(diǎn):
示例場(chǎng)景:
-- name 列有普通索引
EXPLAIN SELECT * FROM users WHERE name = '張三';
輸出特征:
優(yōu)化建議:
為頻繁查詢的條件添加合適的索引
考慮使用覆蓋索引減少回表操作
注意索引的選擇性,高選擇性列更適合建索引
5. range ★★☆☆☆
特點(diǎn):
示例場(chǎng)景:
-- age 列有索引
EXPLAIN SELECT * FROM users WHERE age BETWEEN 20 AND 30;
EXPLAIN SELECT * FROM users WHERE id IN (1, 2, 3);
輸出特征:
type: range
key: 使用的索引名
rows: 范圍掃描的行數(shù)估計(jì)
優(yōu)化建議:
注意范圍查詢后的列索引會(huì)失效
在聯(lián)合索引中,將范圍查詢列放在最后
考慮使用覆蓋索引優(yōu)化查詢
6. index ★★☆☆☆
特點(diǎn):
示例場(chǎng)景:
-- 索引覆蓋查詢(status 有索引)
EXPLAIN SELECT status FROM users;
-- 使用索引但需要排序
EXPLAIN SELECT id FROM users ORDER BY id;
輸出特征:
優(yōu)化建議:
7. ALL ☆☆☆☆☆(最差)
特點(diǎn):
全表掃描
性能最差,尤其是大表
表示沒(méi)有使用任何索引
示例場(chǎng)景:
-- 沒(méi)有為 address 列創(chuàng)建索引
EXPLAIN SELECT * FROM users WHERE address LIKE '%北京%';
-- 沒(méi)有合適的索引可用
EXPLAIN SELECT * FROM users WHERE created_at > '2023-01-01';
輸出特征:
type: ALL
key: NULL
rows: 表的總行數(shù)
Extra: Using where
優(yōu)化建議:
三、性能對(duì)比總結(jié)表

四、實(shí)戰(zhàn)優(yōu)化案例
問(wèn)題查詢:
EXPLAIN SELECT * FROM orders WHERE customer_id = 100 AND order_date > '2023-01-01'
假設(shè)當(dāng)前 type
顯示為 ALL
,表示全表掃描。
優(yōu)化步驟:
1.添加聯(lián)合索引:
ALTER TABLE orders ADD INDEX idx_customer_date(customer_id, order_date);
2.驗(yàn)證優(yōu)化效果:
EXPLAIN SELECT * FROM orders
WHERE customer_id = 100 AND order_date > '2023-01-01';
現(xiàn)在 type
應(yīng)該變?yōu)?nbsp;range
。
3.進(jìn)一步優(yōu)化(使用覆蓋索引):
EXPLAIN SELECT order_id, order_date FROM orders
WHERE customer_id = 100 AND order_date > '2023-01-01';
如果只需要部分列,可以考慮使用覆蓋索引。
閱讀原文:原文鏈接?
該文章在 2025/9/23 15:29:06 編輯過(guò)