Mysql-explain語句

1、【前言】
MySql優(yōu)化是java程序員面試中逃避不過的知識(shí)點(diǎn),而簡(jiǎn)單、優(yōu)雅、高效的SQL語句是SQL優(yōu)化最總要的部分之一,如何寫出性能優(yōu)越的SQL,Explain語句是不可或缺的技能,所謂知己知彼方能百戰(zhàn)不殆,了解一個(gè)SQL語句的執(zhí)行情況是優(yōu)化這條語句的前提。Explain命令在解決數(shù)據(jù)庫(kù)性能上是第一推薦使用命令,大部分的性能問題可以通過此命令來簡(jiǎn)單的解決,Explain可以用來查看SQL語句的執(zhí)行效 果,可以幫助選擇更好的索引和優(yōu)化查詢語句,寫出更好的優(yōu)化語句。

2、【語法】

Explain語法:explain select … from … [where …]

例如:explain select * from tableName;
簡(jiǎn)單的說就是explain關(guān)鍵字后面跟你要檢查的SQL語句

3、【結(jié)果輸出】

+----+-------------+-------+-------+-------------------+---------+---------+-------+------
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+-------+-------------------+---------+---------+-------+------

explain語句輸出的結(jié)果共有10列內(nèi)容,各個(gè)列均有不同的含義所在
4、【結(jié)果屬性】

4.1 【id】
id:這是SELECT的查詢序列號(hào)

4.2【select_type 】
select_type:select_type就是select的類型,可以有以下幾種:

SIMPLE:簡(jiǎn)單SELECT(不使用UNION或子查詢等)
PRIMARY:最外面的SELECT
UNION:UNION中的第二個(gè)或后面的SELECT語句
DEPENDENT UNION:UNION中的第二個(gè)或后面的SELECT語句,取決于外面的查詢
UNION RESULT:UNION的結(jié)果。
SUBQUERY:子查詢中的第一個(gè)SELECT
DEPENDENT SUBQUERY:子查詢中的第一個(gè)SELECT,取決于外面的查詢
DERIVED:導(dǎo)出表的SELECT(FROM子句的子查詢)

4.3【table 】
table:顯示這一行的數(shù)據(jù)是關(guān)于哪張表的

4.4【type 】
type:這列最重要,顯示了連接使用了哪種類別,有無使用索引,是使用Explain命令分析性能瓶頸的關(guān)鍵項(xiàng)之一。

結(jié)果值從好到壞依次是:

system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL

一般來說,得保證查詢至少達(dá)到range級(jí)別,最好能達(dá)到ref,否則就可能會(huì)出現(xiàn)性能問題。

4.5【possible_keys 】
possible_keys:列指出MySQL能使用哪個(gè)索引在該表中找到行

4.6【key 】
key:顯示MySQL實(shí)際決定使用的鍵(索引)。如果沒有選擇索引,鍵是NULL

4.7【key_len 】
key_len:顯示MySQL決定使用的鍵長(zhǎng)度。如果鍵是NULL,則長(zhǎng)度為NULL。使用的索引的長(zhǎng)度。在不損失精確性的情況下,長(zhǎng)度越短越好

4.8【ref 】
ref:顯示使用哪個(gè)列或常數(shù)與key一起從表中選擇行。

4.9【rows 】
rows:顯示MySQL認(rèn)為它執(zhí)行查詢時(shí)必須檢查的行數(shù)。

4.10【Extra 】
Extra:包含MySQL解決查詢的詳細(xì)信息,也是關(guān)鍵參考項(xiàng)之一。

Distinct
一旦MYSQL找到了與行相聯(lián)合匹配的行,就不再搜索了

Not exists
MYSQL 優(yōu)化了LEFT JOIN,一旦它找到了匹配LEFT JOIN標(biāo)準(zhǔn)的行,

就不再搜索了

Range checked for each

Record(index map:#)
沒有找到理想的索引,因此對(duì)于從前面表中來的每一 個(gè)行組合,MYSQL檢查使用哪個(gè)索引,并用它來從表中返回行。這是使用索引的最慢的連接之一

Using filesort
看 到這個(gè)的時(shí)候,查詢就需要優(yōu)化了。MYSQL需要進(jìn)行額外的步驟來發(fā)現(xiàn)如何對(duì)返回的行排序。它根據(jù)連接類型以及存儲(chǔ)排序鍵值和匹配條件的全部行的行指針來 排序全部行

Using index
列數(shù)據(jù)是從僅僅使用了索引中的信息而沒有讀取實(shí)際的行動(dòng)的表返回的,這發(fā)生在對(duì)表 的全部的請(qǐng)求列都是同一個(gè)索引的部分的時(shí)候

Using temporary
看到這個(gè)的時(shí)候,查詢需要優(yōu)化了。這 里,MYSQL需要?jiǎng)?chuàng)建一個(gè)臨時(shí)表來存儲(chǔ)結(jié)果,這通常發(fā)生在對(duì)不同的列集進(jìn)行ORDER BY上,而不是GROUP BY上

Using where
使用了WHERE從句來限制哪些行將與下一張表匹配或者是返回給用戶。如果不想返回表中的全部行,并且連接類型ALL或index, 這就會(huì)發(fā)生,或者是查詢有問題
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容