sql優(yōu)化
關(guān)于sql優(yōu)化,面試中經(jīng)常被問道,由于本人也是小白一枚,請(qǐng)大家對(duì)我寬容點(diǎn)下面是我整理的一些sql優(yōu)化措施,不多說直接上干貨:
1.查詢語句中盡量不要使用*,具體到列名,即使是查詢?nèi)孔詈靡惨獙懗鋈苛忻?/p>
2.模糊查詢中除非必要,否則不要在關(guān)鍵詞前加%
3.當(dāng)你確定查詢到的數(shù)據(jù)只有一條時(shí),請(qǐng)?jiān)诓樵冋Z句后面加上limit 1,因?yàn)镸ySQL數(shù)據(jù)庫引擎會(huì)在找到一條數(shù)據(jù)后停止搜索,而不是繼續(xù)往后查少下一條符合記錄的數(shù)據(jù)。
4.對(duì)經(jīng)常查詢用到的列建立索引,但是不能對(duì)可以為空(null)列建立索引,即使對(duì)該列建立索引也不會(huì)提高性能
5.用EXISTS替代IN、用NOT EXISTS替代NOT IN
6.避免在索引列中使用is null 和is not null ,數(shù)據(jù)類型轉(zhuǎn)換,計(jì)算操作
7.盡量避免在 where 子句中使用 or 來連接條件,否則將導(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.?盡量多用commit語句提交事務(wù),可以及時(shí)釋放資源、解鎖、釋放日志空間、減少管理花費(fèi)
9.除非卻有需要,否則應(yīng)盡量避免使用臨時(shí)表,相反,可以使用表變量代替,因?yàn)楸碜兞狂v扎在內(nèi)存中,因此速度比臨時(shí)表更快,臨時(shí)表駐扎在TempDb數(shù)據(jù)庫中,因此臨時(shí)表上的操作需要跨數(shù)據(jù)庫通信,速度自然慢
10.除非必要,否則盡量少使用子查詢,這樣會(huì)降低查詢效率
最后還有一些數(shù)據(jù)庫的分庫分表,還有主從備份,讀寫分離就不一一贅述了,當(dāng)然主要原因還是我不會(huì),有興趣的同學(xué)可以上網(wǎng)上查詢,如果我以后學(xué)了,可以寫個(gè)簡(jiǎn)單的。數(shù)據(jù)庫的sql優(yōu)化肯定還有好多我沒提到的,這里僅僅是面試時(shí)經(jīng)常用的,希望對(duì)大家有幫助!