關(guān)于數(shù)據(jù)庫優(yōu)化的內(nèi)容整理
查詢優(yōu)化:
一.常見SQL實踐
1.負向條件查詢不使用索引(由于B tree)
not in/not exists !=都不觸發(fā)索引
2.前導(dǎo)模糊查詢不能使用索引
like '%XX'不觸發(fā)索引
3.數(shù)據(jù)區(qū)分度不大的字段不宜使用索引
例如 sex字段,每次過濾掉的數(shù)據(jù)很少,不宜使用索引
4.在屬性上進行計算不能命中索引
select * from order where YEAR(date) < = '2017'
即使date上建立了索引,也會全表掃描山上,可優(yōu)化為值計算:
select * from order where date < = CURDATE()
或者:
select * from order where date < = '2017-01-01'
二.非常見sql實踐
5.如果業(yè)務(wù)大部分為單條查詢,使用hash索引性能更好
B-tree索引時間復(fù)雜度O(log(n))
hash時間復(fù)雜度為O(1)
6.字段設(shè)置默認值或者not null,索引不存儲null值
7.復(fù)合索引最左前綴(順序不限)
8.enum保存的是tinyint,字符串無法保存,索引在PHP中,不要使用enum,直接使用tinyint
9.如果明確知道只有一條結(jié)果返回,limit 1 能夠提高效率,會在獲取一條記錄的時候停止繼續(xù)查詢
10.把計算放在業(yè)務(wù)層而不是數(shù)據(jù)庫層,除了節(jié)省數(shù)據(jù)的CPU,還有意想不到的查詢緩存優(yōu)化效果
原因:
釋放了數(shù)據(jù)庫的CPU
多次調(diào)用吗浩,傳入的SQL相同涧黄,才可以利用查詢緩存
11.類型轉(zhuǎn)換會導(dǎo)致全表掃描(該問題非常隱蔽)
select * from user where phone=13800001234
不會命中索引
以上來源公眾號<<架構(gòu)師之路>>
12. 如果某部分數(shù)據(jù)經(jīng)常有查詢需求,可以將部分數(shù)據(jù)建立索引,這樣每次查詢就可以觸發(fā)覆蓋索引,省去二次查詢,效率提升
13.因為b-tree索引本身就是有排序的,所以在sql的排序字段中使用索引可以避免mysql創(chuàng)建臨時表來排序,可以優(yōu)化查詢效率