SQL優化

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 的字段兩表的字段類型要相同

不然也不會命中索引。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章