SQL 語(yǔ)句調(diào)優(yōu) explain 的用法

在之前 sql 語(yǔ)句執(zhí)行過程的內(nèi)容中,我們提到了查詢優(yōu)化器的內(nèi)容,下面對(duì)其進(jìn)行詳細(xì)說明。

explain 用于獲取查詢執(zhí)行計(jì)劃(即有關(guān)MySQL如何執(zhí)行查詢的說明)。

explain 經(jīng)常與 SELECT,DELETE,INSERT,REPLACE 和 UPDATE 語(yǔ)句一起使用,用來分析這些 sql 語(yǔ)句的執(zhí)行計(jì)劃,當(dāng) explain 與可解釋的語(yǔ)句一起使用時(shí),MySQL 將顯示來自優(yōu)化器的有關(guān)語(yǔ)句執(zhí)行計(jì)劃的信息。也就是說,MySQL 解釋了它將如何處理該語(yǔ)句。

1、優(yōu)化器常用優(yōu)化類型
優(yōu)化器內(nèi)部為了找到最優(yōu)的執(zhí)行計(jì)劃,查詢優(yōu)化器會(huì)對(duì)一些查詢進(jìn)行優(yōu)化,一般可以優(yōu)化的sql類型如下:

254200-1.png

2、explain 的用法介紹
explain 的用法非常簡(jiǎn)單,在你的 sql 語(yǔ)句前加上 explain,點(diǎn)擊執(zhí)行,就可以看到你的 sql 語(yǔ)句的執(zhí)行計(jì)劃。

explain select * from user where id = 1001;
--為了方便查看,可以在語(yǔ)句后面加一個(gè)\G
explain select * from user where id = 1001 \G;
explain 用于獲取執(zhí)行計(jì)劃信息的信息如下,需要特別關(guān)注的內(nèi)容如下:

254200-2.png

3、連接類型 type 的常用值說明
const:表示通過主鍵或者唯一索引的列與一個(gè)常數(shù)值進(jìn)行比較時(shí)會(huì)使用 const 連接,查詢效率最高,比如:

SELECT * FROM table_name WHERE primary_key=1;
eq_ref:表示唯一索引掃描,對(duì)于每個(gè)索引列在表中只有一條記錄與之匹配,查詢效率也很高,比如:

SELECT * FROM ref_table,other_table
WHERE ref_table.key_column=other_table.column;
ref :表示非唯一索引掃描,也就是說每個(gè)索引列在表中不只單條記錄與之匹配,也是索引查詢,效率也算高;

range:只檢索給定范圍的記錄,也是使用索引來選擇行,平常開發(fā)中至少要達(dá)到 range 的級(jí)別,否則需要優(yōu)化;

SELECT * FROM table_name
WHERE key_column
BETWEEN 10 and 20;
index:索引全表掃描,按索引順序掃描一遍從而查找數(shù)據(jù)行,效率較低,除非 Uses index 出現(xiàn)在 Extra列中。

All:全表掃描,遍歷全表從而查找數(shù)據(jù)行,效率最低,一般需要通過添加索引來避免這種情況。

4、附加信息 Extra 的常用值說明
Using filesort:使用了文件進(jìn)行排序,效率較低

Using index:使用了覆蓋索引,效率較高

Using temporary:使用了臨時(shí)表

Using where:使用了 where 條件

后面將為大家介紹 MySQL 服務(wù)器的調(diào)優(yōu)策略。


作者:追夢(mèng)人dreamcatcher


歡迎關(guān)注微信公眾號(hào) :追夢(mèng)Java