MySQL explain獲取查詢(xún)指令信息原理及實(shí)例
explain用于獲取查詢(xún)執(zhí)行計(jì)劃信息,
一、語(yǔ)法
只需要在select前加上explain即可,如:
mysql> explain select 1; +----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+----------------+ | id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra | +----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+----------------+ | 1 | SIMPLE | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | No tables used | +----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+----------------+
二、explain中的信息
1、id:表示SELECT所屬的行。id越大,則執(zhí)行順序越高,id相同時(shí),從上到下執(zhí)行。
2、select_type:顯示對(duì)應(yīng)行是簡(jiǎn)單還是復(fù)雜查詢(xún)
1)SIMPLE:簡(jiǎn)單查詢(xún),意味著不包含子查詢(xún)和UNION
2)SUBQUERY:表示是個(gè)子查詢(xún)
3)DERIVED:用來(lái)表示包含在FORM子句的子查詢(xún)中的SELECT
4)UNION:
3、table:表示訪問(wèn)哪個(gè)表
4、partitions:訪問(wèn)分區(qū)
5、type:關(guān)聯(lián)類(lèi)型,就是如何查找表中的行。
1)ALL:全表掃描。為了查找數(shù)據(jù)必須從頭帶尾的掃描所有的數(shù)據(jù)(limit關(guān)鍵字不會(huì)掃描所有數(shù)據(jù))
2)index:索引掃描。這個(gè)跟全表掃描一樣,只是掃描表時(shí)按索引次序而不是行,主要優(yōu)點(diǎn)是避免了排序,最大缺點(diǎn)是承擔(dān)按索引次序讀取整個(gè)表的開(kāi)銷(xiāo)。
3)range:范圍掃描。就是一個(gè)有限制的索引掃描,它開(kāi)始于索引的某一點(diǎn),不用遍歷全部索引。
4)ref:索引訪問(wèn)。它返回所有匹配某個(gè)單值的行。只有使用非唯一性所有或者唯一性所有的非唯一性前綴時(shí)才會(huì)發(fā)生。
5)eq_ref:使用這個(gè)索引查找,最多返回一條記錄,如果主鍵索引和唯一性索引。
6)const,system:當(dāng)MySQL能對(duì)查詢(xún)的某一部分進(jìn)行優(yōu)化并將其轉(zhuǎn)換成一個(gè)常量時(shí),就會(huì)使用這些訪問(wèn)類(lèi)型
6、possible_keys:顯示查詢(xún)可以用哪些所有
7、key:MySQL決定采用哪個(gè)索引來(lái)優(yōu)化這個(gè)該表的訪問(wèn),如果這個(gè)索引沒(méi)有出現(xiàn)在possible_keys中,它可能選擇了一個(gè)覆蓋索引,如果沒(méi)有使用索引,這個(gè)值為NULL
8 、key_len:索引的字節(jié)數(shù),越短越好。一般來(lái)說(shuō)key_len等于索引列字段類(lèi)型長(zhǎng)度,如int是4字節(jié),bigint是8字節(jié),date是3個(gè)字節(jié),datetime是8個(gè)字節(jié);如果索引列是字符串類(lèi)型,則需要考慮他的字符集,utf8每個(gè)字符占3個(gè)字段,可變類(lèi)型(varchar)額外需要2個(gè)字節(jié);如果索引列可為空,則額外需要1個(gè)字段。
9、ref:
10、rows:MySQL估計(jì)為了找到所需的行而要讀取的行
11、filtered:返回結(jié)果的行數(shù)占讀取行數(shù)的百分比(估算),值越大越好
12、Extra:顯示不適合其他列但也重要的信息,常見(jiàn)得值有:
1)Using index:表示使用覆蓋索引,以避免訪問(wèn)表
2)Using where:MySQL服務(wù)器將在存儲(chǔ)引擎檢索行后再進(jìn)行過(guò)濾
3)Using temporary:表示MySQL對(duì)查詢(xún)結(jié)果排序時(shí)會(huì)使用一個(gè)臨時(shí)表。
三、示例
示例1:
mysql> explain select * from bd_dept; +----+-------------+---------+------------+------+---------------+------+---------+------+------+----------+-------+ | id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra | +----+-------------+---------+------------+------+---------------+------+---------+------+------+----------+-------+ | 1 | SIMPLE | bd_dept | NULL | ALL | NULL | NULL | NULL | NULL | 3 | 100.00 | NULL | +----+-------------+---------+------------+------+---------------+------+---------+------+------+----------+-------+
可以看出該語(yǔ)句進(jìn)行了全表掃描,沒(méi)有用到索引
示例2:
mysql> explain select * from bd_dept where id=1; +----+-------------+---------+------------+-------+---------------+---------+---------+-------+------+----------+-------+ | id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra | +----+-------------+---------+------------+-------+---------------+---------+---------+-------+------+----------+-------+ | 1 | SIMPLE | bd_dept | NULL | const | PRIMARY | PRIMARY | 4 | const | 1 | 100.00 | NULL | +----+-------------+---------+------------+-------+---------------+---------+---------+-------+------+----------+-------+
該語(yǔ)句用到了主鍵索引,只需掃描一條記錄就可以得到結(jié)果,int類(lèi)型占4個(gè)字節(jié),所以ken_len=4。
示例3:
mysql> explain select * from bd_dept where dept_code='01'; +----+-------------+---------+------------+-------+---------------+-----------+---------+-------+------+----------+-------+ | id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra | +----+-------------+---------+------------+-------+---------------+-----------+---------+-------+------+----------+-------+ | 1 | SIMPLE | bd_dept | NULL | const | dept_code | dept_code | 32 | const | 1 | 100.00 | NULL | +----+-------------+---------+------------+-------+---------------+-----------+---------+-------+------+----------+-------+
dept_code是一個(gè)唯一性索引字段,字段類(lèi)型為varchar(10),不為空,所以索引長(zhǎng)度為10*3+2=33。
示例4:
mysql> explain select * from bd_dept where create_date>'2020-04-29'; +----+-------------+---------+------------+-------+---------------+-------------+---------+------+------+----------+-----------------------+ | id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra | +----+-------------+---------+------------+-------+---------------+-------------+---------+------+------+----------+-----------------------+ | 1 | SIMPLE | bd_dept | NULL | range | create_date | create_date | 4 | NULL | 1 | 100.00 | Using index condition | +----+-------------+---------+------------+-------+---------------+-------------+---------+------+------+----------+-----------------------+
create_date是date類(lèi)型,普通索引字段,可為空,查詢(xún)條件為大于,所以關(guān)聯(lián)類(lèi)型為range,索引長(zhǎng)度為3+1=4。
示例5:
mysql> explain select a.id, a.dept_name, b.dept_name parent_name from bd_dept a inner join bd_dept b on a.id=b.parent_id; +----+-------------+-------+------------+--------+---------------+---------+---------+----------------------+------+----------+-------------+ | id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra | +----+-------------+-------+------------+--------+---------------+---------+---------+----------------------+------+----------+-------------+ | 1 | SIMPLE | b | NULL | ALL | NULL | NULL | NULL | NULL | 3 | 100.00 | Using where | | 1 | SIMPLE | a | NULL | eq_ref | PRIMARY | PRIMARY | 4 | zhi_test.b.parent_id | 1 | 100.00 | NULL | +----+-------------+-------+------------+--------+---------------+---------+---------+----------------------+------+----------+-------------+
可以看出MySQL先執(zhí)行一個(gè)全表掃描,再通過(guò)主鍵進(jìn)行關(guān)聯(lián)
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
MySQL實(shí)現(xiàn)字符串的拼接,截取,替換,查找位置的操作
這篇文章主要介紹了MySQL實(shí)現(xiàn)字符串的拼接,截取,替換,查找位置的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-02-02
mysql中的int類(lèi)型對(duì)應(yīng)于java中的Long類(lèi)型詳解
這篇文章主要介紹了mysql中的int類(lèi)型對(duì)應(yīng)于java中的Long類(lèi)型,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-04-04
mysql中distinct和group?by的區(qū)別淺析
distinct簡(jiǎn)單來(lái)說(shuō)就是用來(lái)去重的,而group by的設(shè)計(jì)目的則是用來(lái)聚合統(tǒng)計(jì)的,兩者在能夠?qū)崿F(xiàn)的功能上有些相同之處,但應(yīng)該仔細(xì)區(qū)分,下面這篇文章主要給大家介紹了關(guān)于mysql中distinct和group?by區(qū)別的相關(guān)資料,需要的朋友可以參考下2023-05-05

