SQL调优小记

目录

SQL优化

SQL语句优化

负向查询不能使用索引

前导模糊查询不能使用索引

数据区分不明显时,不应该建立索引

字段的默认值不要为null

在字段上进行计算不能命中索引

最左前缀问题

明确返回条数

不要让数据库自动强制类型转换

join时两表字段类型要相同

小结

SQL性能优化

使用Explain进行SQL分析

优化数据访问量

重构查询方法


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());
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值