小編給大家分享一下SQL性能優(yōu)化的示例,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
成都創(chuàng)新互聯(lián)公司專業(yè)為企業(yè)提供貴池網(wǎng)站建設(shè)、貴池做網(wǎng)站、貴池網(wǎng)站設(shè)計(jì)、貴池網(wǎng)站制作等企業(yè)網(wǎng)站建設(shè)、網(wǎng)頁(yè)設(shè)計(jì)與制作、貴池企業(yè)網(wǎng)站模板建站服務(wù),十多年貴池做網(wǎng)站經(jīng)驗(yàn),不只是建網(wǎng)站,更提供有價(jià)值的思路和整體網(wǎng)絡(luò)服務(wù)。
SQL性能優(yōu)化
1、SELECT 語(yǔ)句務(wù)必指明字段名稱
SELECT * 會(huì)增加很多不必要的消耗,(cpu、io、內(nèi)存、網(wǎng)絡(luò)帶寬);增加了使用覆蓋索引的可能性;
當(dāng)表結(jié)構(gòu)發(fā)生改變時(shí),前斷也需要更新。所以要求直接在select后面接上字段名。
2、SQL語(yǔ)句中IN包含的值不應(yīng)太多
MySQL對(duì)于IN做了相應(yīng)的優(yōu)化,即將IN中的常量全部存儲(chǔ)在一個(gè)數(shù)組里面,而且這個(gè)數(shù)組是排好序的。
但是如果數(shù)值較多,產(chǎn)生的消耗也是比較大的。對(duì)于連續(xù)的數(shù)值,能用 between 就不要用 in 了;再或者使用連接來(lái)替換。
3、區(qū)分in和exists,not in 和not exists
select * from 表A where id in (select id from 表B)
等價(jià)于
select * from 表A where exists(select * from 表B where 表B.id=表A.id)
區(qū)分in和exists主要是造成了驅(qū)動(dòng)順序的改變(這是性能變化的關(guān)鍵),如果是exists,那么以外層表為驅(qū)動(dòng)表,先被訪問(wèn),如果是IN,那么先執(zhí)行子查詢。
所以IN適合于外表大而內(nèi)表小的情況;EXISTS適合于外表小而內(nèi)表大的情況。
4、不建議使用%前綴模糊查詢
例如LIKE “%name”或者LIKE “%name%”,這種查詢會(huì)導(dǎo)致索引失效而進(jìn)行全表掃描。但是可以使用LIKE “name%”。
避免隱式類型轉(zhuǎn)換:
where子句中出現(xiàn) column 字段的類型和傳入的參數(shù)類型不一致的時(shí)候發(fā)生的類型轉(zhuǎn)換,建議先確定where中的參數(shù)類型
5、對(duì)于聯(lián)合索引來(lái)說(shuō),要遵循最左前綴法則
舉列來(lái)說(shuō)索引含有字段id,name,school,可以直接用id字段,也可以id,name這樣的順序,但是name;school都無(wú)法使用這個(gè)索引。
所以在創(chuàng)建聯(lián)合索引的時(shí)候一定要注意索引字段順序,常用的查詢字段放在最前面
總結(jié)以上建議:
1、避免對(duì)索引字段進(jìn)行計(jì)算操作
2、避免在索引字段上使用 not <> !=
3、避免在索引字段上使用 is null , is not null
3、避免在索引字段上出現(xiàn)數(shù)據(jù)類型轉(zhuǎn)換
4、避免在索引字段上使用函數(shù)
5、避免建立索引的列中使用空值
6、對(duì)與WHERE的語(yǔ)句法則
7、盡量避免在WHERE子句中使用in, not in 或者 having ,可以使用exist ,not exist 代替 in ,not in
8、不要以字符格式聲明數(shù)字, 不要以數(shù)字格式聲明字符值,否則會(huì)使索引無(wú)效
以上是“SQL性能優(yōu)化的示例”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!