使用explain查詢SQL的執(zhí)行計(jì)劃
示例:
explain select * from `discussions` where `title` like '%hh%' or `text` like '%hh%' or `catagory_id` in (select `id` from `catagories` where `name` like '%hh%') order by `created_at` desc limit 10 \G
*************************** 1. row ***************************
id: 1
select_type: PRIMARY
table: discussions
type: ALL
possible_keys: NULL
key: NULL
key_len: NULL
ref: NULL
rows: 86
Extra: Using where; Using filesort
*************************** 2. row ***************************
id: 2
select_type: DEPENDENT SUBQUERY
table: catagories
type: unique_subquery
possible_keys: PRIMARY
key: PRIMARY
key_len: 4
ref: func
rows: 1
Extra: Using where
2 rows in set (0.00 sec)
explain返回各列的含義:
table:顯示這一行的數(shù)據(jù)時(shí)關(guān)于哪張表的
type:這是重要的列,顯示連接使用了何種類型。從最好到最差的連接類型為const、eq_reg、ref、range、index和ALL
(const一般是主鍵或唯一索引,eq_reg一般是主鍵和唯一索引的范圍查找,ref常見(jiàn)于聯(lián)結(jié)查詢即一個(gè)表是基于另一個(gè)索引的查找,range基于索引的范圍查找,index對(duì)于索引的掃描,ALL表掃描)
possible_keys:顯示可能應(yīng)用在這張表中的索引。如果為空,沒(méi)有可能的索引。
key:實(shí)際使用的索引。如果為NULL,則沒(méi)有使用索引。
key_len:使用的索引的長(zhǎng)度,在不損失精確性的情況下,長(zhǎng)度越短越好
ref:顯示索引的哪一列被使用了,如果可能的話,是一個(gè)常數(shù)
rows:MySQL認(rèn)為必須檢查的用來(lái)返回請(qǐng)求數(shù)據(jù)的行數(shù)
extra列需要主要的返回值:
Using filesort:當(dāng)看到這個(gè)的時(shí)候,查詢就需要優(yōu)化了。MySQL需要進(jìn)行額外的步驟來(lái)發(fā)現(xiàn)如何對(duì)返回的行排序。它根據(jù)聯(lián)結(jié)類型以及存儲(chǔ)鍵值和匹配條件的全部行的行指針來(lái)排序全部行
Using temporary:當(dāng)看到這個(gè)的時(shí)候,查詢需要優(yōu)化了。這里,MySQL需要?jiǎng)?chuàng)建一個(gè)臨時(shí)表來(lái)存儲(chǔ)結(jié)果,這通常發(fā)生在對(duì)不同的列集進(jìn)行order by上,而不是group by上
參考網(wǎng)站: