SQL數(shù)據(jù)庫如何優(yōu)化?
網(wǎng)友解答: 面試的時(shí)候經(jīng)常會(huì)文檔一些SQL方面的問題,比較常見的面試題例如“什么時(shí)候回造成索引失效?”,又或者“你經(jīng)常做的SQL優(yōu)化的工作有哪些?”下面,我就介紹幾個(gè)有關(guān)SQL優(yōu)化的知識(shí)
面試的時(shí)候經(jīng)常會(huì)文檔一些SQL方面的問題,比較常見的面試題例如“什么時(shí)候回造成索引失效?”,又或者“你經(jīng)常做的SQL優(yōu)化的工作有哪些?”
下面,我就介紹幾個(gè)有關(guān)SQL優(yōu)化的知識(shí)點(diǎn)。
負(fù)向條件查詢不能使用索引:包括!=、not in、not exists都盡量不要使用;
%在前面的模糊查詢:where name like '%xxx';
等號(hào)左邊有函數(shù):where upper(str) = '...',就算str字段有索引,這個(gè)寫法也不會(huì)走索引;
數(shù)據(jù)區(qū)分度不大的字段,不要建索引:例如性別男、女、為止,這種就不適合建立索引;
隱式轉(zhuǎn)換:where tel = 13800000000,如果tel字段是varchar類型,這個(gè)寫法不會(huì)報(bào)錯(cuò),但是會(huì)索引失效;
只返回需要的數(shù)據(jù):select name,gender from users 優(yōu)于 select * from users;
允許為Null的列,有風(fēng)險(xiǎn):比如 where name != 'Tom',如果name允許為Null,索引不儲(chǔ)存Null值,結(jié)果集不包含這些記錄;因?yàn)樗饕淮鎯?chǔ)Null值,所以is null也不會(huì)走索引;
如果業(yè)務(wù)大部分是單條記錄查詢,那么Hash索引效率更高
復(fù)合索引最左前綴:(name,gender)復(fù)合索引,where name=xx and gender =x 可以命中,where name=xx可以命中,where gender =x不能命中。