explain執(zhí)行計劃需要關(guān)注的幾個關(guān)鍵字段詳細(xì)解釋
在使用 EXPLAIN
分析 MySQL 查詢時,通常會關(guān)注以下幾個關(guān)鍵字段,以了解查詢的執(zhí)行計劃和性能瓶頸。以下是詳細(xì)的解釋:
1. EXPLAIN 中需要關(guān)注的字段
id
:- 查詢的標(biāo)識符。如果是簡單查詢,值為 1;如果是子查詢或聯(lián)合查詢,會有不同的值。
select_type
:- 查詢的類型,例如
SIMPLE
(簡單查詢)、PRIMARY
(主查詢)、SUBQUERY
(子查詢)等。
- 查詢的類型,例如
table
:- 查詢涉及的表名。
partitions
:- 查詢涉及的分區(qū)(如果表使用了分區(qū))。
type
:- 最重要的字段之一,表示 MySQL 如何訪問表中的數(shù)據(jù)。常見的取值包括
ALL
、index
、range
、ref
等。
- 最重要的字段之一,表示 MySQL 如何訪問表中的數(shù)據(jù)。常見的取值包括
possible_keys
:- 可能使用的索引。
key
:- 實際使用的索引。
key_len
:- 使用的索引的長度(字節(jié)數(shù))。
ref
:- 顯示索引的哪一列被使用了,常見值為
const
、func
或NULL
。
- 顯示索引的哪一列被使用了,常見值為
rows
:- 預(yù)估需要掃描的行數(shù)。
filtered
:- 表示查詢條件過濾后的行數(shù)百分比。
Extra
:- 額外的信息,例如
Using where
、Using index
、Using temporary
等。
- 額外的信息,例如
2. type 字段的常見取值
system
:- 表中只有一行數(shù)據(jù)(系統(tǒng)表),是性能最好的類型。
const
:- 通過主鍵或唯一索引查找,最多返回一行數(shù)據(jù)。例如:
SELECT * FROM table WHERE id = 1;
- 通過主鍵或唯一索引查找,最多返回一行數(shù)據(jù)。例如:
eq_ref
:- 在聯(lián)表查詢中,使用主鍵或唯一索引進(jìn)行匹配。例如:
SELECT * FROM table1 t1 JOIN table2 t2 ON t1.id = t2.id;
- 在聯(lián)表查詢中,使用主鍵或唯一索引進(jìn)行匹配。例如:
ref
:- 使用非唯一索引查找數(shù)據(jù)。例如:
SELECT * FROM table WHERE key_column = 'value';
- 使用非唯一索引查找數(shù)據(jù)。例如:
fulltext
:- 使用了全文索引。
ref_or_null
:- 類似于
ref
,但包含NULL
值的查找。例如:SELECT * FROM table WHERE key_column = 'value' OR key_column IS NULL;
- 類似于
index_merge
:- 使用了索引合并(Index Merge),即多個索引的結(jié)果合并。
unique_subquery
:- 在子查詢中使用了唯一索引。
index_subquery
:- 在子查詢中使用了非唯一索引。
range
:- 使用索引進(jìn)行范圍查找。例如:
SELECT * FROM table WHERE id BETWEEN 1 AND 100;
- 使用索引進(jìn)行范圍查找。例如:
index
:- 全索引掃描,即掃描整個索引樹。
ALL
:- 全表掃描,性能最差,通常需要優(yōu)化。
3. Extra 字段的常見取值
Using where
:- 使用了
WHERE
條件過濾數(shù)據(jù)。
- 使用了
Using index
:- 使用了覆蓋索引(Covering Index),即查詢的列都在索引中。
Using temporary
:- 使用了臨時表,通常發(fā)生在排序或分組時。
Using filesort
:- 使用了文件排序,通常發(fā)生在無法使用索引排序時。
Using join buffer
:- 使用了連接緩沖區(qū)(Join Buffer),通常發(fā)生在聯(lián)表查詢時。
Impossible WHERE
:WHERE
條件永遠(yuǎn)為假,例如WHERE 1 = 0
。
4. 工作中的關(guān)注點
type
:- 確保查詢盡可能使用高效的類型(如
const
、eq_ref
、ref
、range
),避免ALL
(全表掃描)。
- 確保查詢盡可能使用高效的類型(如
key
:- 確保查詢使用了合適的索引。
rows
:- 預(yù)估掃描的行數(shù)越少,查詢性能越好。
Extra
:- 避免
Using temporary
和Using filesort
,這些通常意味著性能問題。
- 避免
5. 示例分析
EXPLAIN SELECT * FROM users WHERE age > 30;
輸出結(jié)果:
+----+-------------+-------+------+---------------+------+---------+------+------+-------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+-------+------+---------------+------+---------+------+------+-------------+ | 1 | SIMPLE | users | ALL | NULL | NULL | NULL | NULL | 1000 | Using where | +----+-------------+-------+------+---------------+------+---------+------+------+-------------+
type
為ALL
,表示全表掃描,需要優(yōu)化。Extra
為Using where
,表示使用了WHERE
條件過濾。
6. 總結(jié)
- 重點關(guān)注
type
、key
、rows
和Extra
字段。 - 確保查詢使用了合適的索引,避免全表掃描和臨時表。
- 根據(jù)
EXPLAIN
的結(jié)果,調(diào)整查詢語句或索引設(shè)計,優(yōu)化性能。
到此這篇關(guān)于explain執(zhí)行計劃需要關(guān)注的幾個關(guān)鍵字段的文章就介紹到這了,更多相關(guān)explain執(zhí)行計劃關(guān)鍵字段內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
dubbo中zookeeper請求超時問題:mybatis+spring連接mysql8.0.15的配置
這篇文章主要介紹了dubbo中zookeeper請求超時問題:mybatis+spring連接mysql8.0.15的配置,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下2020-01-01詳解如何對MySQL數(shù)據(jù)庫進(jìn)行授權(quán)管理
MySQL數(shù)據(jù)授權(quán)是指數(shù)據(jù)庫管理員通過設(shè)置權(quán)限,控制用戶對數(shù)據(jù)庫中的數(shù)據(jù)的訪問和操作能力,在MySQL中,每個用戶賬戶都有特定的權(quán)限,本文給大家介紹了如何對MySQL數(shù)據(jù)庫進(jìn)行授權(quán)管理,需要的朋友可以參考下2024-11-11MySQL數(shù)據(jù)庫的觸發(fā)器和事務(wù)
這篇文章主要介紹了MySQL數(shù)據(jù)庫的觸發(fā)器和事務(wù),觸發(fā)器是SQL?server提供給程序員和數(shù)據(jù)分析員來保證數(shù)據(jù)完整性的一種方法,它是與表事件相關(guān)的特殊的存儲過程,是由事件來觸發(fā)2022-08-08