不建议使用前项通配符查找
- Content:例如“%foo”,查询参数有一个前项通配符的情况无法使用已有索引。
- Case:
select c1,c2,c3 from tbl where name like '%foo'
没有通配符的LIKE查询
- Content:不包含通配符的LIKE查询可能存在逻辑错误,因为逻辑上它与等值查询相同。
- Case:
select c1,c2,c3 from tbl where name like 'foo'
参数比较包含隐式转换,无法使用索引
- Content:隐式类型转换有无法命中索引的风险,在高并发、大数据量的情况下,命不中索引带来的后果非常严重。
- Case:
SELECT * FROM sakila.film WHERE length >= '60';
IN要慎用,元素过多会导致全表扫描
- Content: 如:select id from t where num in(1,2,3)对于连续的数值,能用BETWEEN就不要用IN了:select id from t where num between 1 and 3。而当IN值过多时MySQL也可能会进入全表扫描导致性能急剧下降。
- Case:
select id from t where num in(1,2,3)
应尽量避免在WHERE子句中对字段进行NULL值判断
- Content:使用IS NULL或IS NOT NULL将可能导致引擎放弃使用索引而进行全表扫描,如:select id from t where num is null;可以在num上设置默认值0,确保表中num列没有null值,然后这样查询: select id from t where num=0;
- Case:
select id from t where num is null