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