目录
SQL优化
当存在慢SQL时,我们首先需要检测一下SQL语句是否可以进行优化(写SQL的时候就需要思考能否优化),然后,再考虑性能优化。
SQL语句优化
负向查询不能使用索引
当我们使用not in的时候,哪怕中了索引, 也是相当于失效的。
select name from user where id not in (1,3,4);
-- 应该修改为
select name from user where id in (2,5,6);
前导模糊查询不能使用索引
在使用like匹配字符时,若%在前面,则索引失效。
select name from user where name like '%zhangsan'
-- 尽可能改为
select name from user where name like 'zhangsan%'
建议可以考虑使用 Lucene
等全文索引工具来代替频繁的模糊查询。
数据区分不明显时,不应该建立索引
如果数据字段无法明显区分,则不应该建立索引,因为建立索引会消耗空间,就像一本50页的书有50页的目录。
字段的默认值不要为null
null可能会在数据查询时,进行类型的隐式转化,导致索引失效,而且可能会导致查询的结果与预期不一致。
在字段上进行计算不能命中索引
计算函数尽量不要在字段上进行,即不要转换字段类型或者对字段操作(计算、函数、类型转换(手动or自动)),会导致索引失效,转向全表扫描。
select name from user where FROM_UNIXTIME(create_time) < CURDATE();
-- 应该修改为
select name from user where create_time < FROM_UNIXTIME(CURDATE());