這篇文章將為大家詳細(xì)講解有關(guān)MySQL 5.7如何查看SQL執(zhí)行計(jì)劃,小編覺(jué)得挺實(shí)用的,因此分享給大家做個(gè)參考,希望大家閱讀完這篇文章后可以有所收獲。
可以使用EXPLAIN語(yǔ)句查看SQL的執(zhí)行計(jì)劃,執(zhí)行計(jì)劃的信息來(lái)自于優(yōu)化器。
在MySQL 5.7,可以查看SELECT, DELETE, INSERT, REPLACE, 和 UPDATE語(yǔ)句的執(zhí)行計(jì)劃。
在MySQL 5.7.3,EXPLAIN EXTENDED可以獲取更詳細(xì)的執(zhí)行計(jì)劃信息,EXPLAIN PARTITIONS在獲取有分區(qū)表的執(zhí)行計(jì)劃時(shí)很有用。
FORMAT選項(xiàng)可以用來(lái)選擇輸出的格式。TRADITIONAL代表以表格形式輸出,它是默認(rèn)的輸出格式。JSON格式代表以JSON格式輸出,輸出結(jié)果中包含擴(kuò)展的執(zhí)行計(jì)劃信息和分區(qū)表信息。
如果索引沒(méi)有正常使用,可以通過(guò)運(yùn)行ANALYZE TABLE命令來(lái)更新表的統(tǒng)計(jì)信息,例如鍵值的cardinality,這會(huì)影響到優(yōu)化器的選擇。
mysql> explain select * from emp e where e.deptno not in (select deptno from dept d);
+----+--------------------+-------+-----------------+---------------+---------+---------+------+------+-------------------------------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+--------------------+-------+-----------------+---------------+---------+---------+------+------+-------------------------------------------------+
| 1 | PRIMARY | e | ALL | NULL | NULL | NULL | NULL | 14 | Using where |
| 2 | DEPENDENT SUBQUERY | d | unique_subquery | PRIMARY | PRIMARY | 4 | func | 1 | Using index; Using where; Full scan on NULL key |
+----+--------------------+-------+-----------------+---------------+---------+---------+------+------+-------------------------------------------------+
2 rows in set (0.00 sec)
輸出字段說(shuō)明:
id 查詢(xún)的執(zhí)行順序號(hào)
select_type 查詢(xún)類(lèi)型,包括:
SIMPLE 簡(jiǎn)單查詢(xún)(不使用UNION或子查詢(xún))
PRIMARY 最外層的SELECT語(yǔ)句
UNION 在UNION結(jié)構(gòu)中的第二個(gè)及以上的SELECT語(yǔ)句
DEPENDENT UNION 在UNION結(jié)構(gòu)中的第二個(gè)及以上的SELECT語(yǔ)句,依賴(lài)外層查詢(xún)
UNION RESULT UNION的結(jié)果
SUBQUERY 子查詢(xún)中的第一個(gè)SELECT語(yǔ)句
DEPENDENT SUBQUERY 子查詢(xún)中的第一個(gè)SELECT語(yǔ)句,依賴(lài)于外層查詢(xún)
DERIVED 子查詢(xún)中FROM后面的語(yǔ)句
MATERIALIZED 物化視圖子查詢(xún)
UNCACHEABLE SUBQUERY 查詢(xún)結(jié)果沒(méi)有被緩存且需要重新外層查詢(xún)計(jì)算每行數(shù)據(jù)的子查詢(xún)
UNCACHEABLE UNION UNION 結(jié)構(gòu)中第二個(gè)及之后的SELECT語(yǔ)句且沒(méi)有生成查詢(xún)緩存
table 表名
type 表連接的類(lèi)型,包括:
system 表中只有一行數(shù)據(jù),這是cost連接類(lèi)型的一種特殊情況
const 表中只有一行匹配記錄,且在查詢(xún)中被最先讀取
eq_ref 和之前的表作nested loop連接時(shí),每次兩個(gè)表中連接字段相比,都有一行匹配的記錄。當(dāng)索引中的所有部分被用于連接且索引是主鍵索引或UNIQUE非空索引時(shí),會(huì)使用這種類(lèi)型。
ref 每次和之前的表做連接時(shí),讀取所有符合條件的索引值。如果連接使用索引的最左邊前綴字段,或者索引不是主鍵或UNIQUE索引,會(huì)用到這種連接方式,也就是說(shuō)如果連接不能基于每個(gè)符合連接條件的索引值選擇出單獨(dú)的一行,則會(huì)使用這種連接方式。
fulltext 使用FULLTEXT索引來(lái)建立連接
ref_or_null 連接類(lèi)型類(lèi)似ref,除此之外,MySQL會(huì)額外掃描出包含NULL值的行。這種連接方式通常用于有子查詢(xún)的情形下。
index_merge 使用索引合并的連接方式。在這種情況下,key字段會(huì)包含使用的索引,key_len包含使用索引的最長(zhǎng)索引部分。
unique_subquery 這種連接方式在某種情況下會(huì)代替eq_ref,如value IN (SELECT primary_key FROM single_table WHERE some_expr),這種方式使用索引查詢(xún)功能代替子查詢(xún),以獲得更好的執(zhí)行效率。
index_subquery 這種連接方式類(lèi)似unique_subquery。它會(huì)代替IN子查詢(xún),但是它適用于非unique索引的子查詢(xún),如value IN (SELECT key_column FROM single_table WHERE some_expr)
range 使用索引掃描出指定范圍的行。key字段指示使用的索引。key_len指示索引的最大長(zhǎng)度。ref字段會(huì)顯示NULL
index 這種索引連接類(lèi)型和ALL相同,除了索引樹(shù)被掃描到。這會(huì)出現(xiàn)在兩種情況下:一、如果該索引是一個(gè)覆蓋索引查詢(xún),且只掃描出索引樹(shù)。在這種情況下,Extra字段會(huì)顯示Using index。二、通過(guò)索引順序來(lái)執(zhí)行全表掃描。
ALL 和之前表做連接時(shí),每次兩表關(guān)聯(lián)時(shí)都做全表掃描。
possible_keys 可供選擇的索引
key 實(shí)際選擇的索引
key_len 選擇的索引長(zhǎng)度
ref 顯示和索引相比較的字段或常量,如果這個(gè)字段的值是func,這個(gè)值會(huì)用在函數(shù)的結(jié)果中。
rows 估計(jì)的表的行數(shù)
Extra 額外信息
mysql> explain select * from buy_log where userid=2;
+----+-------------+---------+------+-----------------+--------+---------+-------+------+-------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+---------+------+-----------------+--------+---------+-------+------+-------+
| 1 | SIMPLE | buy_log | ref | userid,userid_2 | userid | 4 | const | 1 | NULL |
+----+-------------+---------+------+-----------------+--------+---------+-------+------+-------+
1 row in set (0.00 sec)
(04:14:50) [dmcdbMTNNG]> explain select count(*) from ADDSubscribers where timestamp between 1483351200 and 1483354800;
+----+-------------+----------------+-------+---------------+-----------+---------+------+---------+-----------------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+----------------+-------+---------------+-----------+---------+------+---------+-----------------------------------+
| 1 | SIMPLE | ADDSubscribers | range | Timestamp | Timestamp | 8 | NULL | 3515427 | Using where with pushed condition |
+----+-------------+----------------+-------+---------------+-----------+---------+------+---------+-----------------------------------+
1 row in set (0.00 sec)
這個(gè)信息只適用于NDB表。MySQL Cluster使用這個(gè)條件來(lái)提高效率。
Using where with pushed condition (JSON property: message)
This item applies to NDB tables only. It means that MySQL Cluster is using the Condition Pushdown
optimization to improve the efficiency of a direct comparison between a nonindexed column and a
constant. In such cases, the condition is “pushed down” to the cluster's data nodes and is evaluated on
all data nodes simultaneously. This eliminates the need to send nonmatching rows over the network, and
can speed up such queries by a factor of 5 to 10 times over cases where Condition Pushdown could be
but is not used. For more information, see Section 9.2.1.5, “Engine Condition Pushdown Optimization”.
關(guān)于“MySQL 5.7如何查看SQL執(zhí)行計(jì)劃”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,使各位可以學(xué)到更多知識(shí),如果覺(jué)得文章不錯(cuò),請(qǐng)把它分享出去讓更多的人看到。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。