資源描述:
《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