下文主要給大家?guī)?lái)MySQL查詢優(yōu)化工具explain,希望這些內(nèi)容能夠帶給大家實(shí)際用處,這也是我編輯這篇文章的主要目的。好了,廢話不多說(shuō),大家直接看下文MySQL查詢優(yōu)化工具explain吧。
創(chuàng)新互聯(lián)專注于企業(yè)全網(wǎng)整合營(yíng)銷推廣、網(wǎng)站重做改版、仲巴網(wǎng)站定制設(shè)計(jì)、自適應(yīng)品牌網(wǎng)站建設(shè)、H5技術(shù)、成都做商城網(wǎng)站、集團(tuán)公司官網(wǎng)建設(shè)、外貿(mào)網(wǎng)站制作、高端網(wǎng)站制作、響應(yīng)式網(wǎng)頁(yè)設(shè)計(jì)等建站業(yè)務(wù),價(jià)格優(yōu)惠性價(jià)比高,為仲巴等各大城市提供網(wǎng)站開(kāi)發(fā)制作服務(wù)。
在日常的MYSQL優(yōu)化中我們常??吹竭@樣一個(gè)關(guān)鍵詞:explain,例如這種:
EXPLAIN SELECT * FROM Cloud_Order WHERE money > 10;
explain是什么呢?使用 EXPLAIN 關(guān)鍵字可以模擬優(yōu)化器執(zhí)行SQL查詢語(yǔ)句,從而知道MySQL是如何處理你的SQL語(yǔ)句的。這可以幫你分析你的查詢語(yǔ)句或是表結(jié)構(gòu)的性能瓶頸。通過(guò)explain命令可以得到:
表的讀取順序
數(shù)據(jù)讀取操作的操作類型
哪些索引可以使用
哪些索引被實(shí)際使用
表之間的引用
每張表有多少行被優(yōu)化器查詢
首先讓我們來(lái)看看使用EXPLAIN輸入的結(jié)果
結(jié)果顯示輸出了結(jié)果一堆字段和對(duì)應(yīng)的值,但是這些字段是什么意思?對(duì)應(yīng)的值又是什么呢?如何通過(guò)這些字段來(lái)分析到SQL的性能并做出優(yōu)化呢?別急,下面我們就一起來(lái)一一分析。
id: SELECT識(shí)別符。這是SELECT的查詢序列號(hào)
select_type:SELECT類型,可以為以下任何一種
·SIMPLE:簡(jiǎn)單SELECT(不使用UNION或子查詢)
·PRIMARY:最外面的SELECT
·UNION:UNION中的第二個(gè)或后面的SELECT語(yǔ)句
·DEPENDENT UNION:UNION中的第二個(gè)或后面的SELECT語(yǔ)句,取決于外面的查詢
·UNION RESULT:UNION的結(jié)果
·SUBQUERY:子查詢中的第一個(gè)SELECT
·DEPENDENT SUBQUERY:子查詢中的第一個(gè)SELECT,取決于外面的查詢
·DERIVED:導(dǎo)出表的SELECT(FROM子句的子查詢)
table:顯示這一行的數(shù)據(jù)是關(guān)于哪張表的
type:這是最重要的字段之一,顯示查詢使用了何種類型。從最好到最差的連接類型為system、const、eq_reg、ref、range、index和ALL。下面給出各種類型,按照從最佳類型到最壞類型進(jìn)行排序:
·system、const:可以將查詢的變量轉(zhuǎn)為常量. 如id=1; id為主鍵或唯一鍵.
·eq_ref:訪問(wèn)索引,返回某單一行的數(shù)據(jù).(通常在聯(lián)接時(shí)出現(xiàn),查詢使用的索引為主鍵或惟一鍵)
·ref:訪問(wèn)索引,返回某個(gè)值的數(shù)據(jù).(可以返回多行)通常使用=時(shí)發(fā)生
·range:這個(gè)連接類型使用索引返回一個(gè)范圍中的行,比如使用>或<查找東西,并且該字段上建有索引時(shí)發(fā)生的情況(注:不一定好于index)
·index:以索引的順序進(jìn)行全表掃描,優(yōu)點(diǎn)是不用排序,缺點(diǎn)是還要全表掃描
·ALL:全表掃描,應(yīng)該盡量避免
possible_keys:顯示可能應(yīng)用在這張表中的索引。如果為空,沒(méi)有可能的索引??梢詾橄嚓P(guān)的域從WHERE語(yǔ)句中選擇一個(gè)合適的語(yǔ)句
key:實(shí)際使用的索引。如果為NULL,則沒(méi)有使用索引。MYSQL很少會(huì)選擇優(yōu)化不足的索引,此時(shí)可以在SELECT語(yǔ)句中使用USE INDEX(index)來(lái)強(qiáng)制使用一個(gè)索引或者用IGNORE INDEX(index)來(lái)強(qiáng)制忽略索引
key_len:使用的索引的長(zhǎng)度。在不損失精確性的情況下,長(zhǎng)度越短越好
ref:顯示索引的哪一列被使用了,如果可能的話,是一個(gè)常數(shù)
rows:MySQL認(rèn)為必須檢索的用來(lái)返回請(qǐng)求數(shù)據(jù)的行數(shù)
filtered:顯示了通過(guò)條件過(guò)濾出的行數(shù)的百分比估計(jì)值。
Extra:關(guān)于MYSQL如何解析查詢的額外信息,主要有以下幾種
·Distinct:MySQL發(fā)現(xiàn)第1個(gè)匹配行后,停止為當(dāng)前的行組合搜索更多的行。
·rangecheckedfor each record(index map:#):MySQL沒(méi)有發(fā)現(xiàn)好的可以使用的索引,但發(fā)現(xiàn)如果來(lái)自前面的表的列值已知,可能部分索引可以使用。
·Using index:只用到索引,可以避免訪問(wèn)表.
·Using tmporary:用到臨時(shí)表
·Usingwhere:使用到where來(lái)過(guò)慮數(shù)據(jù).不是所有的where clause都要顯示usingwhere.如以=方式訪問(wèn)索引.
·Using filesort:MySQL需要額外的一次傳遞,以找出如何按排序順序檢索行。
說(shuō)了這么多,實(shí)踐才能出真知。下面我們通過(guò)一個(gè)簡(jiǎn)單的例子來(lái)優(yōu)化我們一些不堪的SQL。
首先我們還是一張數(shù)據(jù)表舉例。表結(jié)構(gòu)如下。
這是一張典型的訂單表,其他字段我們可以省略不看,我們可以只看一個(gè)money字段,這基本是訂單表都會(huì)用到的字段。由于時(shí)間關(guān)系,事先我已經(jīng)為這個(gè)表準(zhǔn)備了一堆模擬數(shù)據(jù)。
從上圖可以看出,表中已經(jīng)有一萬(wàn)條數(shù)據(jù),下面我們來(lái)寫(xiě)一個(gè)根據(jù)money條件來(lái)查詢訂單的SQL。
只能說(shuō)上圖的結(jié)果不盡人意。讓我們回到之前explain字段的分析,其中type字段的值是ALL,按照分析來(lái)說(shuō),這個(gè)表用了全表搜索,我們應(yīng)盡量避免?。?!再看rows字段,值是16242,天啊??!所有記錄都去請(qǐng)求了,那慢是有原因的。
好了,通過(guò)上面的數(shù)據(jù)分析,我們可以去想一下,money字段是否能加上索引來(lái)提升查詢速度呢?因?yàn)樯鲜鼋Y(jié)果中好像是沒(méi)用到索引的。話不多說(shuō),我們來(lái)為money字段加上索引
加上索引之后,我們?cè)儆脛倓偟腅XPLAIN語(yǔ)句執(zhí)行一下,見(jiàn)證奇跡的時(shí)候到了!
經(jīng)過(guò)加上索引之后,相同的sql語(yǔ)句,得出的結(jié)果完全不一樣,type字段變成了range,我們也看到key顯示了money,證明了索引值被用上了。更重要的是rows字段變成了785,跟原來(lái)相比少了不知道多少,可想而知性能有了多大的提高!
對(duì)于以上關(guān)于MySQL查詢優(yōu)化工具explain介紹,大家是不是覺(jué)得非常有幫助。如果需要了解更多內(nèi)容,請(qǐng)繼續(xù)關(guān)注我們的行業(yè)資訊,相信你會(huì)喜歡上這些內(nèi)容的。