很慚愧,寫了快兩年的SQL邓夕,突然發(fā)現(xiàn)SQL性能優(yōu)化需要注意的點(diǎn)自己竟然不知道刘莹。趁著今天下班比較早,還有剩余電量焚刚,先把百度能搜羅到的答案整理如下栋猖,為尊重原創(chuàng),來(lái)源均備注出處汪榔。
表連接和內(nèi)嵌:
1、連接的表越多肃拜、性能越差痴腌,盡可能將表連接分拆成若干個(gè)過程逐一執(zhí)行
2、盡量避免使用外連接燃领,因?yàn)樾枰笥冶矶紥呙?/h5>
3士聪、使用臨時(shí)表,少用子查詢猛蔽,減少內(nèi)嵌層數(shù)
語(yǔ)句優(yōu)化:
1剥悟、exists/anti join/semi join替代in
not in是最低效的灵寺,因?yàn)橐獙?duì)子查詢的表進(jìn)行全表掃描∏冢可以考慮使用外鏈接或not exists略板。如下:
select * from 表A where id in (select id from 表B)
相當(dāng)于
select * from 表A where exists(select * from 表B where 表B.id=表A.id)
相當(dāng)于
select * from 表A left semi join 表B on 表B.id=表A.id
select colname … from A表 where a.id not in (select b.id from B表)
相當(dāng)于
select colname … from A表 left join B表 on where a.id = b.id where b.id is null
相當(dāng)于
select colname … from A表 left anti join B表 on where a.id = b.id
2、盡量用union all代替union慈缔,union all或union代替or
union具有去重的操作叮称,增加了計(jì)算時(shí)間。union all不需要去重藐鹤,但會(huì)包含相同記錄瓤檐。同樣功能下,首選union all操作娱节。
-- 高效:
SELECT LOC_ID , LOC_DESC , REGION FROM LOCATION WHERE LOC_ID = 10
UNION
SELECT LOC_ID , LOC_DESC , REGION FROM LOCATION WHERE REGION = 'MELBOURNE'
-- 低效:
SELECT LOC_ID ,LOC_DESC ,REGION FROM LOCATION WHERE LOC_ID=10 OR REGION ='MELBOURNE'
3挠蛉、>與>=
-- 直接定位到4的記錄(推薦)
select .. from .. where SAL >= 4 ;
-- 先定位到3,再向后找1個(gè)(不推薦)
select .. from .. where SAL > 3 ;
4肄满、SELECT語(yǔ)句務(wù)必指明字段名稱
不要用select * 谴古,SELECT*增加很多不必要的消耗(CPU、IO悄窃、內(nèi)存讥电、網(wǎng)絡(luò)帶寬);增加了使用覆蓋索引的可能轧抗,所以要求直接在select后面接上字段名恩敌。
5、避免在where子句中對(duì)字段進(jìn)行null值判斷
對(duì)于null的判斷會(huì)導(dǎo)致引擎放棄使用索引而進(jìn)行全表掃描横媚。
select id from t where num is null
可以在num上設(shè)置默認(rèn)值0纠炮,確保表中num列沒有null值,然后這樣查詢:
select id from t where num=0
6灯蝴、盡量避免在 where 子句中使用!=或<>操作符
否則將引擎放棄使用索引而進(jìn)行全表掃描恢口。
7、避免在 where 子句中使用 or 來(lái)連接條件
否則將導(dǎo)致引擎放棄使用索引而進(jìn)行全表掃描
select id from t where num=10 or num=20
可以這樣查詢:
select id from t where num=10
union all
select id from t where num=20
8穷躁、避免在where子句中對(duì)字段進(jìn)行函數(shù)操作耕肩,
這將導(dǎo)致引擎放棄使用索引而進(jìn)行全表掃描
select id from t where substring(name,1,3)='abc'--name以abc開頭的id
應(yīng)改為:
select id from t where name like 'abc%'
9、對(duì)于聯(lián)合索引來(lái)說问潭,要遵守最左前綴法則
舉列來(lái)說索引含有字段id猿诸、name、school狡忙,可以直接用id字段梳虽,也可以id、name這樣的順序灾茁,但是name;school都無(wú)法使用這個(gè)索引窜觉。所以在創(chuàng)建聯(lián)合索引的時(shí)候一定要注意索引字段順序谷炸,常用的查詢字段放在最前面。
10禀挫、like
通配符出現(xiàn)在首位旬陡,無(wú)法使用索引,反之可以特咆。
-- 無(wú)法使用索引
select .. from .. where name like '%t%' ;
-- 可以使用索引
select .. from .. where name like 't%' ;
內(nèi)容來(lái)源:
https://www.cnblogs.com/xupccc/p/9661972.html
http://blog.itpub.net/31555484/viewspace-2565387/
https://blog.csdn.net/qq_38789941/article/details/83744271