資源描述:
《mysqlsql語(yǔ)句的優(yōu)化面試》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在工程資料-天天文庫(kù)。
1、mysqlsql語(yǔ)句的優(yōu)化面試MySQL查詢語(yǔ)句優(yōu)化心得MySQL優(yōu)化Sql查詢語(yǔ)句優(yōu)化心得MySQL優(yōu)化2010-12-2414:31作為一個(gè)互聯(lián)X開(kāi)發(fā)工程師,數(shù)據(jù)庫(kù)的知識(shí)是必不可少的,要是寫(xiě)幾條查詢效率很差的SQL,當(dāng)數(shù)據(jù)庫(kù)的數(shù)據(jù)到達(dá)一定級(jí)別以后,沒(méi)幾個(gè)人同時(shí)訪問(wèn)你的X站,就能把你的一臺(tái)服務(wù)器高掛啦!【個(gè)人認(rèn)為:最為簡(jiǎn)單的測(cè)試方法就是把SQL語(yǔ)句在命令行下運(yùn)行,若查詢的語(yǔ)句需要0.03秒以上的SQL語(yǔ)句都需要優(yōu)化?!咳缦碌拇蠖喽紒?lái)自X絡(luò):終歸起來(lái)、都是一些簡(jiǎn)單SQL優(yōu)化,不敢保證這說(shuō)法絕對(duì)的權(quán)威哦。phpma1
2、、用程序中,保證在實(shí)現(xiàn)功能的基礎(chǔ)上,盡量減少對(duì)數(shù)據(jù)庫(kù)的訪問(wèn)次數(shù);通過(guò)搜索參數(shù),盡量減少對(duì)表的訪問(wèn)行數(shù),最小化結(jié)果集,從而減輕X絡(luò)負(fù)擔(dān);能夠分開(kāi)的操作盡量分開(kāi)處理,提高每次的響應(yīng)速度;在數(shù)據(jù)窗口使用SQL時(shí),盡量把使用的索引放在選擇的首列;算法的結(jié)構(gòu)盡量簡(jiǎn)單;在查詢時(shí),不要過(guò)多地使用通配符如SELECT*FROMT1語(yǔ)句,要用到幾列就選擇幾列如:SELECTCOL1,COL2FROMT1;在可能的情況下盡量限制盡量結(jié)果集行數(shù)如:SELECTTOP300COL1,COL2,COL3FROMT1,因?yàn)槟承┣闆r下用戶是不需
3、要那么多的數(shù)據(jù)的。不要在應(yīng)用中使用數(shù)據(jù)庫(kù)游標(biāo),游標(biāo)是非常有用的工具,但比使用常規(guī)的、面向集的SQL語(yǔ)句需要更大的開(kāi)銷(xiāo);按照特定順序提取數(shù)據(jù)的查找。2、避免使用不兼容的數(shù)據(jù)類(lèi)型。例如float和int、char和varchar、binary和varbinary是不兼容的。數(shù)據(jù)類(lèi)型的不兼容可能使優(yōu)化器無(wú)法執(zhí)行一些本來(lái)可以進(jìn)行的優(yōu)化操作。例如:SELECTnameFROMemployeeT1T1RECORDRECORDmembersmembersemployee(T1.C1)FROMT1T2(T1.C1)FROMT1T2
4、table_nametable_namehdr_tbla----tbla表示tbl用別名a代替dtl_tblbhdr_tblaLEFTJOINdtl_tblbONa.hdr_key=b.hdr_keyhdr_tbldtl_tbl)三種寫(xiě)法都可以得到同樣正確的結(jié)果,但是效率依次降低。7、盡量避免在索引過(guò)的字符數(shù)據(jù)中,使用非打頭字母搜索。這也使得引擎無(wú)法利用索引。見(jiàn)如下例子:SELECT*FROMT1ELIKE‘%L%’SELECT*FROMT1E,2,1)=’L’SELECT*FROMT1ELIKE‘L%’即使NAM
5、E字段建有索引,前兩個(gè)查詢依然無(wú)法利用索引完成加快操作,引擎不得不對(duì)全表所有數(shù)據(jù)逐條操作來(lái)完成任務(wù)。而第三個(gè)查詢能夠使用索引來(lái)加快操作。51ruan.8、分利用連接條件,在某種情況下,兩個(gè)表之間可能不只一個(gè)的連接條件,這時(shí)在(A.AMOUNT)FROMACCOUNTA,CARDB(A.AMOUNT)FROMACCOUNTA,CARDBordersordersordersT1T1DetailsDetailsT1T1T1T1(INDEX=IX_ProcessID)T1語(yǔ)句,要用到幾列就選擇幾列如:SELECTCOL1,
6、COL2FROMT1;在可能的情況下盡量限制盡量結(jié)果集行數(shù)如:SELECTTOP300COL1,COL2,COL3FROMT1,因?yàn)槟承┣闆r下用戶是不需要那么多的數(shù)據(jù)的。在沒(méi)有建索引的情況下,數(shù)據(jù)庫(kù)查找某一條數(shù)據(jù),就必須進(jìn)行全表掃描了,對(duì)所有數(shù)據(jù)進(jìn)行一次遍歷,查找出符合條件的記錄。在數(shù)據(jù)量比較小的情況下,也許看不出明顯的差別,但是當(dāng)數(shù)據(jù)量大的情況下,這種情況就是極為糟糕的了。SQL語(yǔ)句在SQL中是如何執(zhí)行的,他們擔(dān)心自己所寫(xiě)的SQL語(yǔ)句會(huì)被SQLSERVER誤解。比如:select*fromtable1e=?zha
7、ngsan?andtID>10000和執(zhí)行:select*fromtable1e=?zhangsan?一些人不知道以上兩條語(yǔ)句的執(zhí)行效率是否一樣,因?yàn)槿绻?jiǎn)單的從語(yǔ)句先后上看,這兩個(gè)語(yǔ)句的確是不一樣,如果tID是一個(gè)聚合索引,那么后一句僅僅從表的10000條以后的記錄中查找就行了;而前一句則要先從全表中查找看有幾個(gè)name=?zhangsan?的,而后再根據(jù)限制條件條件tID>10000來(lái)提出查詢結(jié)果。事實(shí)上,這樣的擔(dān)心是不必要的。SQLSERVER中有一個(gè)“查詢分析優(yōu)化器”,它可以計(jì)算出e=?張三?價(jià)
8、格>50005000<價(jià)格Name=?張三?and價(jià)格>5000如果一個(gè)表達(dá)式不能滿足SARG的形式,那它就無(wú)法限制搜索的范圍了,也就是SQLSERVER必須對(duì)每一行都判斷它是否滿足SCL,SCRAX(IL.score)FROMSCIL,StudentIM.S#=IL.S#GROUPBYIL.C#)andR.Score=(SELECTMIN