資源描述:
《MYSQL查詢優(yōu)化心得》由會員上傳分享,免費在線閱讀,更多相關(guān)內(nèi)容在工程資料-天天文庫。
1、查詢優(yōu)化學(xué)習心得Mysql性能優(yōu)化有兩個方面,一個是邏輯查詢,一個是物理查詢。邏輯杏詢主要從連接的等價轉(zhuǎn)換,連接消除,條件下推等方式對語句進行簡化。子查詢是邏輯優(yōu)化過程中需耍重點關(guān)注的對象,子查詢用的不好,往往會造成過多的表掃描。關(guān)于了查詢的優(yōu)化,需要注意以下兒點:1,在執(zhí)行計劃中出現(xiàn)subQuery,DepentedSubQuery的查詢方式,說明子查詢語句不能優(yōu)化,查詢語句按默認從內(nèi)外往執(zhí)行。先執(zhí)行了杳詢語句,得到一個中間結(jié)果集,再執(zhí)行外層語句。這種情況主要岀現(xiàn)于非spj的子查詢語句中,比如含有distinct,groupby聚合函數(shù),orderbylimit,union.和相關(guān)子查
2、詢。2,可以進行優(yōu)化的子查詢語句表現(xiàn)為嵌套循環(huán)NestedLoop算法,連接方式可以是內(nèi)聯(lián)接(innerjoin)或者是半聯(lián)接(anti-semi-join)如果說在mysql中,內(nèi)聯(lián)接的NestedLoop于了查詢展開的話,那么半聯(lián)接類型的子查詢一般是不能夠展開的,屬于半聯(lián)接的運算符有exists,notexists,in,notin,半聯(lián)接是一種查找算法,只耍查找到等值數(shù)據(jù)立刻退出木次循環(huán),notexists,notin則不同,需要全表掃描。對于嵌套循環(huán)NestedLoop,mysql的一種優(yōu)化方式是Materialized,對子查詢語句先進行物化,再與外表進行NestedLoop在
3、執(zhí)行計劃中,看到derived的查詢類型,說明在NestedLoop'p,該表作為驅(qū)動表,根據(jù)NestedLoop運算符,先遍歷驅(qū)動表的每一行,針對每一行記錄,再到內(nèi)表中杳找對應(yīng)的記錄。驅(qū)動表為全表掃描的外表。3,對于循套嵌套Nestedloop算法,驅(qū)動表的索引并不重要,但查找的內(nèi)表字段最好有索引,如果有索引,了查詢將會優(yōu)化成簡單查詢(simple),也許,這就是子查詢最優(yōu)的解法吧(轉(zhuǎn)成了簡單查詢).4,>al1,>any,>some運算符雖然是ansi聯(lián)接標準,但是曲于這些運算符在語義上并不直觀,而且,這些運算符在杳詢優(yōu)化階段也會被轉(zhuǎn)換成對應(yīng)max,min運算符。所以實際并不常用。所
4、以這類運算符也不能被優(yōu)化。二all,二some,二any屬于等值聯(lián)接,它們可以被優(yōu)化。在sqlserver中,子查詢都轉(zhuǎn)換為嵌套循環(huán)NestedLoop.具性能受NestedLoop算法約束。1,在實際生產(chǎn)環(huán)境中,最常見的子查詢優(yōu)化是notin,notexists子查詢,一般會將其轉(zhuǎn)換成leftjoin+wherecolumnisnull。再一個就是注意子查詢和父查詢的相應(yīng)索引的使用。當然,并非子查詢就是不好的:對于兩個表都比較小,使用子查詢,較低的查找開銷比聯(lián)結(jié)更優(yōu)勝.匹配只返回一個值,使用了杳詢,與必須聯(lián)結(jié)整張表相比,只找錄一條記錄并替換它花費的開銷要少很多匹配只返冋相當少的值,而且
5、查詢列上沒有索引,使用子查詢,通常,單獨的一次或者甚至數(shù)次查找所花費的開銷都比散列聯(lián)結(jié)少另,子查詢也是必不可少,很多業(yè)務(wù)邏輯必須要用子查詢來實現(xiàn)。一些實驗的例了:相關(guān)子查詢select*fromt4wheret4.id4二any(selectt5.id5fromt5wheret5.b5二14.b4);id4a4b4?111222333444555666IE相關(guān)子?xùn)嗽僺elect*fromtlwhereal=any(selecta2fromt2wheret2.a2=10);idlalblV1010101091010920810208307103074061040650510505IN操作符
6、SELECTcolumnname(s)FROMtablenameWHEREcolumnnameIN(valuel,value2,...)select*fromt4wheret4.id4in(1,3);—id4a4b4Vi11333ALLANYSOME操作符select*fromt5wheret5.id5>any(selectid4fromt4wheret4.id4>5);HdSa5b5?777888999101010select*fromt5wheret5.id5>ALL(selectid4fromt4wheret4.id4>5);―id5a5b5V888999101010EXISTS操
7、作符select*fromt5whereexists(select*fTomt4wheret4?id4>t5.icl5);id5aSb5
8、?1112223334445SS666轉(zhuǎn)化成同義的口語句:select*fromt5whereid5in(selectid5fromt4wheret4.id4>t5.id5);id5aSb5?111222333444555666SPJ查詢:選擇:select*fromt4wheret4.id4二1