>  1定義  Mysql查詢優(yōu)化器的工作是為查詢語(yǔ)句選擇合適的執(zhí)行路徑。查詢優(yōu)化器的代碼一般是經(jīng)常變動(dòng)的,這和存儲(chǔ)引擎不太一樣。因此,需要理解最新版本的查詢優(yōu)化器是如何組織的,請(qǐng)參考相應(yīng)的源代碼。整體而言,優(yōu)化器">
mysql查詢優(yōu)化器淺析--

mysql查詢優(yōu)化器淺析--

ID:9509424

大小:69.00 KB

頁(yè)數(shù):9頁(yè)

時(shí)間:2018-05-01

mysql查詢優(yōu)化器淺析--_第1頁(yè)
mysql查詢優(yōu)化器淺析--_第2頁(yè)
mysql查詢優(yōu)化器淺析--_第3頁(yè)
mysql查詢優(yōu)化器淺析--_第4頁(yè)
mysql查詢優(yōu)化器淺析--_第5頁(yè)
資源描述:

《mysql查詢優(yōu)化器淺析--》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在應(yīng)用文檔-天天文庫(kù)。

1、MySQL查詢優(yōu)化器淺析>>  1定義  Mysql查詢優(yōu)化器的工作是為查詢語(yǔ)句選擇合適的執(zhí)行路徑。查詢優(yōu)化器的代碼一般是經(jīng)常變動(dòng)的,這和存儲(chǔ)引擎不太一樣。因此,需要理解最新版本的查詢優(yōu)化器是如何組織的,請(qǐng)參考相應(yīng)的源代碼。整體而言,優(yōu)化器有很多相同性,對(duì)mysql一個(gè)版本的優(yōu)化器做到整體掌握,理解起mysql新版本以及其他數(shù)據(jù)庫(kù)的優(yōu)化器都是類似的?! ?yōu)化器會(huì)對(duì)查詢語(yǔ)句進(jìn)行轉(zhuǎn)化,轉(zhuǎn)化等價(jià)的查詢語(yǔ)句。舉個(gè)例子,優(yōu)化器會(huì)將下面語(yǔ)句進(jìn)行轉(zhuǎn)化:  SELECTysql_select()  JOIN::prepare()   setu

2、p_fields()  JOIN::optimize()      /*optimizerisfromhere...*/   optimize_cond()   opt_sum_query()   make_join_statistics()    get_quick_record_count()    choose_plan()     /*Findthebestize_straight_join()      best_access_path()     /*Finda(sub-)optimalplanamongallor

3、subset*/     /*ofallpossiblequeryplansited_search()       best_access_path()     /*Performanexhaustivesearchforanoptimalplan*/     find_best()   make_join_select()    /*...tohere*/  JOIN::exec()  上面的縮進(jìn)表示函數(shù)的相互調(diào)用關(guān)系,因此可以看出handle_select()調(diào)用函數(shù)mysql_select(),mysql_select(

4、)調(diào)用JOIN::prepare(),等等?! ysql_select()首先調(diào)用函數(shù)JOIN::prepare()進(jìn)行語(yǔ)句分析、元數(shù)據(jù)設(shè)置、子查詢轉(zhuǎn)化等等。然后調(diào)用函數(shù)JOIN::optimize()進(jìn)行優(yōu)化,選出最后的執(zhí)行計(jì)劃。最后調(diào)用函數(shù)JOIN::exec()執(zhí)行該執(zhí)行計(jì)劃?! ”M管出現(xiàn)了單詞JOIN,這些優(yōu)化函數(shù)是為所有的查詢語(yǔ)句服務(wù)的,不管你是什么查詢類型?! 『瘮?shù)optimize_cond()和函數(shù)opt_sum_query()是執(zhí)行一些轉(zhuǎn)化操作。函數(shù)make_join_statistics()對(duì)所有可用索引統(tǒng)

5、計(jì)信息進(jìn)行分析?! ?常量轉(zhuǎn)化  對(duì)類似下面的表達(dá)式可以進(jìn)行轉(zhuǎn)化:  n1=column2ANDcolumn2='x';  因?yàn)槲覀冎溃喝绻鸄=BandB=C,那么A=C。所以上面的表達(dá)式可以轉(zhuǎn)化為:  n1='x'ANDcolumn2='x';  對(duì)于column1column2,只要是屬于下面的操作符之一就可以進(jìn)行類似的轉(zhuǎn)化:  =,<,>,<=,>=,<>,<=>,LIKE  從中我們也可以看出,對(duì)于BETn1='y

6、'  因?yàn)榈谝粋€(gè)條件是始終為true的,所以可以移除該條件,變?yōu)椋骸 1='y'  再見(jiàn)如下表達(dá)式:  nISNULL  該條件是始終為false的,再看:  nISNOTNULL  該條件是始終為true的,因此這樣的表達(dá)式也是可以從條件表達(dá)式中刪除的?! ‘?dāng)然,也是有特殊情況的,1234下一頁(yè)>>>>這篇文章來(lái)自..,。比如在outjoin中,被定義為NOTNULL的列也可能包含NULL值。在這種情況下,ISNULL條件是被保留的。  當(dāng)然優(yōu)化器沒(méi)有對(duì)所有的情況進(jìn)行檢測(cè),因?yàn)檫@實(shí)在太復(fù)雜了。舉個(gè)例

7、子:  CREATETABLETable1(column1CHAR(1));    SELECT*FROMTable1ARYKEY(column1,column2)  再看下面的語(yǔ)法:  FROMTable0Table1...ySQL會(huì)預(yù)先評(píng)估常量表,找出這個(gè)值,然后將這個(gè)值引入到查詢語(yǔ)句中進(jìn)行優(yōu)化,舉例如下:  SELECTTable1.unique_not_null_column,Table2.any_column  FROMTable1,Table2  ySQL首先發(fā)現(xiàn)通過(guò)Table1.unique_not_null_c

8、olumn條件的限制,Table1會(huì)變成一個(gè)常量表。然后,取回該值?! ∪绻』夭僮魇?Table1中沒(méi)有行滿足條件unique_not_null_column=5),那么該常量表就包含0行,那么如果對(duì)該語(yǔ)句執(zhí)行EXPLAIN操作,會(huì)得到提示信息:  Impossibley

當(dāng)前文檔最多預(yù)覽五頁(yè),下載文檔查看全文

此文檔下載收益歸作者所有

當(dāng)前文檔最多預(yù)覽五頁(yè),下載文檔查看全文
溫馨提示:
1. 部分包含數(shù)學(xué)公式或PPT動(dòng)畫(huà)的文件,查看預(yù)覽時(shí)可能會(huì)顯示錯(cuò)亂或異常,文件下載后無(wú)此問(wèn)題,請(qǐng)放心下載。
2. 本文檔由用戶上傳,版權(quán)歸屬用戶,天天文庫(kù)負(fù)責(zé)整理代發(fā)布。如果您對(duì)本文檔版權(quán)有爭(zhēng)議請(qǐng)及時(shí)聯(lián)系客服。
3. 下載前請(qǐng)仔細(xì)閱讀文檔內(nèi)容,確認(rèn)文檔內(nèi)容符合您的需求后進(jìn)行下載,若出現(xiàn)內(nèi)容與標(biāo)題不符可向本站投訴處理。
4. 下載文檔時(shí)可能由于網(wǎng)絡(luò)波動(dòng)等原因無(wú)法下載或下載錯(cuò)誤,付費(fèi)完成后未能成功下載的用戶請(qǐng)聯(lián)系客服處理。