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