溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

MySQL查詢(xún)優(yōu)化器的工作原理是什么

發(fā)布時(shí)間:2021-08-09 14:24:46 來(lái)源:億速云 閱讀:248 作者:chen 欄目:數(shù)據(jù)庫(kù)

本篇內(nèi)容介紹了“MySQL查詢(xún)優(yōu)化器的工作原理是什么”的有關(guān)知識(shí),在實(shí)際案例的操作過(guò)程中,不少人都會(huì)遇到這樣的困境,接下來(lái)就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

  MySQL查詢(xún)優(yōu)化器的工作原理是什么

  當(dāng)然,MySQL查詢(xún)優(yōu)化器也利用了索引,但是它也使用了其它一些信息。例如,如果你提交如下所示的查詢(xún),那么無(wú)論數(shù)據(jù)表有多大,MySQL執(zhí)行它的速度都會(huì)非常快:

  SELECT*FROMtbl_nameWHERE0;

  在這個(gè)例子中,MySQL查看WHERE子句,認(rèn)識(shí)到?jīng)]有符合查詢(xún)條件的數(shù)據(jù)行,因此根本就不考慮搜索數(shù)據(jù)表。你可以通過(guò)提供一個(gè)EXPLAIN語(yǔ)句看到這種情況,這個(gè)語(yǔ)句讓MySQL顯示自己執(zhí)行的但實(shí)際上沒(méi)有真正地執(zhí)行的SELECT查詢(xún)的一些信息。如果要使用EXPLAIN,只需要在EXPLAIN單詞放在SELECT語(yǔ)句的前面:

  mysql>EXPLAINSELECT*FROMtbl_nameWHERE0\G***************************1.row***************************id:1select_type:SIMPLEtable:NULLtype:NULLpossible_keys:NULLkey:NULLkey_len:NULLref:NULLrows:NULLExtra:ImpossibleWHERE

  通常情況下,EXPLAIN返回的信息比上面的信息要多一些,還包括用于掃描數(shù)據(jù)表的索引、使用的聯(lián)結(jié)類(lèi)型、每張數(shù)據(jù)表中估計(jì)需要檢查的數(shù)據(jù)行數(shù)量等非空(NULL)信息。

  MySQL查詢(xún)優(yōu)化器是如何工作的

  MySQL查詢(xún)優(yōu)化器有幾個(gè)目標(biāo),但是其中最主要的目標(biāo)是盡可能地使用索引,并且使用最嚴(yán)格的索引來(lái)消除盡可能多的數(shù)據(jù)行。你的最終目標(biāo)是提交SELECT語(yǔ)句查找數(shù)據(jù)行,而不是排除數(shù)據(jù)行。優(yōu)化器試圖排除數(shù)據(jù)行的原因在于它排除數(shù)據(jù)行的速度越快,那么找到與條件匹配的數(shù)據(jù)行也就越快。如果能夠首先進(jìn)行最嚴(yán)格的測(cè)試,查詢(xún)就可以執(zhí)行地更快。假設(shè)你的查詢(xún)檢驗(yàn)了兩個(gè)數(shù)據(jù)列,每個(gè)列上都有索引:

  SELECTcol3FROMmytableWHEREcol1=’somevalue’ANDcol2=’someothervalue’;

  假設(shè)col1上的測(cè)試匹配了900個(gè)數(shù)據(jù)行,col2上的測(cè)試匹配了300個(gè)數(shù)據(jù)行,而同時(shí)進(jìn)行的測(cè)試只得到了30個(gè)數(shù)據(jù)行。先測(cè)試Col1會(huì)有900個(gè)數(shù)據(jù)行,需要檢查它們找到其中的30個(gè)與col2中的值匹配記錄,其中就有870次是失敗了。先測(cè)試col2會(huì)有300個(gè)數(shù)據(jù)行,需要檢查它們找到其中的30個(gè)與col1中的值匹配的記錄,只有270次是失敗的,因此需要的計(jì)算和磁盤(pán)I/O更少。其結(jié)果是,優(yōu)化器會(huì)先測(cè)試col2,因?yàn)檫@樣做開(kāi)銷(xiāo)更小。

  你可以通過(guò)下面一個(gè)指導(dǎo)幫助優(yōu)化器更好地利用索引:

  盡量比較數(shù)據(jù)類(lèi)型相同的數(shù)據(jù)列。當(dāng)你在比較操作中使用索引數(shù)據(jù)列的時(shí)候,請(qǐng)使用數(shù)據(jù)類(lèi)型相同的列。相同的數(shù)據(jù)類(lèi)型比不同類(lèi)型的性能要高一些。例如,INT與BIGINT是不同的。CHAR(10)被認(rèn)為是CHAR(10)或VARCHAR(10),但是與CHAR(12)或VARCHAR(12)不同。如果你所比較的數(shù)據(jù)列的類(lèi)型不同,那么可以使用ALTERTABLE來(lái)修改其中一個(gè),使它們的類(lèi)型相匹配。

“MySQL查詢(xún)優(yōu)化器的工作原理是什么”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI