《MYSQL教程Mysql之EXPLAIN顯示using filesort介紹》要點(diǎn):
本文介紹了MYSQL教程Mysql之EXPLAIN顯示using filesort介紹,希望對您有用。如果有疑問,可以聯(lián)系我們。
語法格式如下
EXPLAIN tbl_name
或者:
EXPLAIN SELECT select_options
EXPLAIN 語句可以被當(dāng)作 DESCRIBE 的同義詞來用,也可以用來獲取一個(gè)MySQL要執(zhí)行的 SELECT 語句的相關(guān)信息.
EXPLAIN tbl_name 語法和 DESCRIBE tbl_name 或 SHOW COLUMNS FROM tbl_name 一樣.
當(dāng)在一個(gè) SELECT 語句前使用關(guān)鍵字 EXPLAIN 時(shí),MYSQL會(huì)解釋了即將如何運(yùn)行該 SELECT 語句,它顯示了表如何連接、連接的順序等信息.
以下信息為引用:
在explain我們所使用的sql的時(shí)候,經(jīng)常會(huì)遇到using filesort這種情況,原以為是由于有相同列值的原因引起,結(jié)果昨天看到公司的一個(gè)sql,跟同事討論了下加上自己又做了一些測試,突然發(fā)現(xiàn)自己原來的想法是錯(cuò)誤的.
首先,只有在order by 數(shù)據(jù)列的時(shí)候才可能會(huì)出現(xiàn)using filesort,而且如果你不對進(jìn)行order by的這一列設(shè)置索引的話,無論列值是否有相同的都會(huì)出現(xiàn)using filesort.因此,只要用到order by 的這一列都應(yīng)該為其建立一個(gè)索引.
其次,在這次測試中,使用了一個(gè)稍微有點(diǎn)復(fù)雜的例子來說明這個(gè)問題,下面詳細(xì)用這個(gè)例子說一下:
SELECT * FROM DB.TB WHERE ID=2222 AND FID IN (9,8,3,13,38,40) ORDER BY INVERSE_DATE LIMIT 0, 5
里面建立的索引為一個(gè)三列的多列索引:IDX(ID,FID ,INVERSE_DATE) .INVERSE_DATE這個(gè)是時(shí)間的反向索引.
對于這個(gè)sql我當(dāng)時(shí)最開始認(rèn)為應(yīng)該是個(gè)優(yōu)化好的狀態(tài),應(yīng)該沒有什么紕漏了,結(jié)果一explain才發(fā)現(xiàn)竟然出現(xiàn)了:Using where; Using filesort.
為什么呢,后來經(jīng)過分析才得知,原來在多列索引在建立的時(shí)候是以B-樹結(jié)構(gòu)建立的,因此建立索引的時(shí)候是先建立ID的按順序排的索引,在相同ID的情況下建立FID按 順序排的索引,最后在FID 相同的情況下建立按INVERSE_DATE順序排的索引,如果列數(shù)更多以此類推.有了這個(gè)理論依據(jù)我們可以看出在這個(gè)sql使用這個(gè)IDX索引的時(shí)候只是用在了order by之前,order by INVERSE_DATE 實(shí)際上是using filesort出來的..汗死了..因此如果我們要在優(yōu)化一下這個(gè)sql就應(yīng)該為它建立另一個(gè)索引IDX(ID,INVERSE_DATE),這樣就消除了using filesort速度也會(huì)快很多.問題終于解決了.
轉(zhuǎn)載請注明本頁網(wǎng)址:
http://www.fzlkiss.com/jiaocheng/2676.html