負(fù)向查詢不能使用索引
select name from user where id not in (1,3,4);
應(yīng)該修改為:
select name from user where id in (2,5,6);
前導(dǎo)模糊查詢不能使用索引
如:
select name from user where name like '%zhangsan'
非前導(dǎo)則可以:
select name from user where name like 'zhangsan%'
建議可以考慮使用 Lucene
等全文索引工具來代替頻繁的模糊查詢往史。
數(shù)據(jù)區(qū)分不明顯的不建議創(chuàng)建索引
如 user 表中的性別字段旱捧,可以明顯區(qū)分的才建議創(chuàng)建索引,如身份證等字段。
字段的默認(rèn)值不要為 null
這樣會帶來和預(yù)期不一致的查詢結(jié)果宪睹。
在字段上進(jìn)行計(jì)算不能命中索引
select name from user where FROM_UNIXTIME(create_time) < CURDATE();
應(yīng)該修改為:
select name from user where create_time < FROM_UNIXTIME(CURDATE());
最左前綴問題
如果給 user 表中的 username pwd 字段創(chuàng)建了復(fù)合索引那么使用以下SQL 都是可以命中索引:
select username from user where username='zhangsan' and pwd ='axsedf1sd'
select username from user where pwd ='axsedf1sd' and username='zhangsan'
select username from user where username='zhangsan'
但是使用
select username from user where pwd ='axsedf1sd'
是不能命中索引的。
如果明確知道只有一條記錄返回
select name from user where username='zhangsan' limit 1
可以提高效率,可以讓數(shù)據(jù)庫停止游標(biāo)移動(dòng)姆打。
不要讓數(shù)據(jù)庫幫我們做強(qiáng)制類型轉(zhuǎn)換
select name from user where telno=18722222222
這樣雖然可以查出數(shù)據(jù),但是會導(dǎo)致全表掃描肠虽。
需要修改為
select name from user where telno='18722222222'
如果需要進(jìn)行 join 的字段兩表的字段類型要相同
不然也不會命中索引幔戏。