SQL 優化
負向查詢不能使用索引
select name from user where id not in (1,3,4);
應該修改爲:
select name from user where id in (2,5,6);
前導模糊查詢不能使用索引
如:
select name from user where name like '%zhangsan'
非前導則可以:
select name from user where name like 'zhangsan%'
建議可以考慮使用 Lucene
等全文索引工具來代替頻繁的模糊查詢。
數據區分不明顯的不建議創建索引
如 user 表中的性別字段,可以明顯區分的才建議創建索引,如身份證等字段。
字段的默認值不要爲 null
這樣會帶來和預期不一致的查詢結果。
在字段上進行計算不能命中索引
select name from user where FROM_UNIXTIME(create_time) < CURDATE();
應該修改爲:
select name from user where create_time < FROM_UNIXTIME(CURDATE());
最左前綴問題
如果給 user 表中的 username pwd 字段創建了複合索引那麼使用以下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
可以提高效率,可以讓數據庫停止遊標移動。
不要讓數據庫幫我們做強制類型轉換
select name from user where telno=18722222222
這樣雖然可以查出數據,但是會導致全表掃描。
需要修改爲
select name from user where telno='18722222222'
如果需要進行 join 的字段兩表的字段類型要相同
不然也不會命中索引。