sql語(yǔ)句優(yōu)化
1.使用limit對(duì)查詢結(jié)果的記錄進(jìn)行限定
2.避免select,只取具體字段
3.使用連接(join)代替子查詢
4.拆分大的delete和insert語(yǔ)句
5.分組統(tǒng)計(jì)可以禁止排序(指定ORDER BY NULL*避免排序結(jié)果的消耗)
SELECT goods_id,count(*) FROM t GROUP BY goods_id ORDER BY NULL;
- 禁止不必要的ORDER BY排序
- 盡量不要超過三個(gè)表join
選擇合適的數(shù)據(jù)類型
1.使用簡(jiǎn)單的數(shù)據(jù)類型,減少開銷(eg:只含數(shù)值信息的字段盡量不要設(shè)計(jì)為字符型)
2.使用合理的字段屬性長(zhǎng)度辫封、固定的數(shù)據(jù)長(zhǎng)度(不要varchar)
3.盡可能使用not null定義字段
4.盡量少使用text
選擇合適的索引列
1.重新頻繁的列,在where、group by、order by捺信、on從句中出現(xiàn)的列
2.where條件中<豪嚎,<=,=鹃彻,>,>=妻献,between蛛株,in,以及l(fā)ike 字符串+通配符(%)出現(xiàn)的列
3.長(zhǎng)度小的列育拨,索引字段越小越好(數(shù)據(jù)庫(kù)的存儲(chǔ)單位是頁(yè)谨履,一頁(yè)中能存的數(shù)據(jù)越多越好)
4.離散度大(不同的值多)的列,放在聯(lián)合索引前面
避免索引失效
1.字段類型轉(zhuǎn)換(如字符串類型的不用引號(hào)熬丧,數(shù)字類型的用引號(hào)等笋粟,這有可能會(huì)用不到索引導(dǎo)致全表掃描)
2.根據(jù)聯(lián)合索引的非首字段單獨(dú)查詢用不到索引
3.字段前加函數(shù)/加減運(yùn)算,否則會(huì)導(dǎo)致索引失效
如下面語(yǔ)句將進(jìn)行全表掃描:
select id from t where num/2=100
SELECT * FROM t WHERE YEAR(d) >= 2016
可改為:
select id from t where num=100*2
SELECT * FROM t WHERE d >= '2016-01-01';
4.搜索嚴(yán)禁左模糊或者全模糊
select name from t where name like %s
select name from t where name like %s%
- 避免在 where 子句中使用!=或<>操作符析蝴,否則將引擎放棄使用索引而進(jìn)行全表掃描
select id from t where num != 2
可改為
select id from t where num > 2 and num < 2
6.避免在where子句中對(duì)字段進(jìn)行 **null **值判斷害捕,否則將導(dǎo)致引擎放棄使用索引而進(jìn)行全表掃描
select id from t where num is null
可改為
select id from t where num=0
7.用IN或UNION來(lái)替換OR低效查詢
SELECT * FROM t WHERE LOC_ID = 10 OR LOC_ID = 20 OR LOC_ID = 30;
可改為
SELECT * FROM t WHERE LOC_IN IN (10,20,30);
對(duì)于連續(xù)的數(shù)值,能用 between 就不要用** in **
select id from t where num between 1 and 3
8.刪除表所有記錄用** truncate**闷畸,不要用 delete