負向查詢不能使用索引數據庫
select * from system_user where id not in (1,2,3,4,5)索引
應該修改成it
select * from system_user where id in(6,7,8,9,10) 效率
前導模糊查詢不能使用索引select
select name from system_user where name like '%yuanzheng'im
非前導則能夠 數據
select name from system_user where name like 'zengy%'查詢
數據區分不明顯的不建議建立索引移動
如 user 表中的性別字段,能夠明顯區分的才建議建立索引,如身份證等字段。類型轉換
字段的默認值不要設置爲null
這樣會帶來和預期不一致的查詢結果。
在字段上計算不能命中索引
select * from system_user where FROM_UNIXTIME(create_time) < CURDATE()
應該修改成
select * from system_user where create_time < FROM_UNIXTIME(CURDATE())
最左前綴問題
若是給 user 表中的 username pwd 字段建立了複合索引那麼使用如下SQL 都是能夠命中索引
select * from system_user where username='zengyz' and pwd='123456'
select * from system_user where pwd='123456' and username='zengyz'
select * from system_user where username='zengyz'
可是使用
select * from system_user where pwd='123456'
是不能命中索引的
若是明確知道只有一條記錄返回
select * from system_user where username='zengyz' limit 1
能夠提升效率,能夠讓數據庫中止遊標移動
不要讓數據庫幫咱們作強制類型轉換
select * from system_user where phone=13200000000
這樣雖然能夠查出數據,可是會致使全表掃描。
須要修改成
select * from system_user where phone='13200000000'