SQL优化

我们看错了世界,却说世界欺骗了我们


SQL优化主要分三个部分
1、SQL本身优化
2、反范式设计优化
3、索引优化

先找到慢的SQL,可以通过慢查询日志结合慢查询工具找到执行时间较长的SQL

SQL本身优化

1、select子句中避免使用 * ,尽量应该根据业务需求,一旦使用了这种语句,便会让优化器无法完成索引覆盖扫描这类优化,而且还会增加额外的I/O、内存和CPU的消耗。

2、尽量多使用commit如对大数据量的分段批量提交释放了资源,减轻了服务器压力,提高系统并发能力。

3、在写sql语句的话,尽量保持每次查询的sql语句用大写,因为oracle情况总是先解析sql语句,把小写的字母转换成大写的再执行

4、用union-all替换union,因为union-all不会过滤重复字段,所执行效率要快于union,并且union可以自动排序,而union-all不会

用 exists 代替 in

7、用表的别名,来代替表名.字段名来使用,可以减少系统运行时候的解析时间,并可以防止SQL语句写错。

8、尽量避免子查询写法(子查询会生成临时表,可以改成多个小查询或使用left join 方式)具体是否用到临时表,可以通过explain来查看,查看Extra列的结果,如果出现Using temporary则需要注意。

9、实际案例分析:拆分大的 DELETE 或INSERT 语句,批量提交SQL语句
如果你需要在一个在线的网站上去执行一个大的 DELETE 或 INSERT 查询,你需要非常小心,要避免你的操作让你的整个网站停止相应。因为这两个操作是会锁表的,表一锁住了,别的操作都进不来了。

反范式设计优化

反的是第三范式,在第二范式基础上消除传递依赖
有时,在一些业务表中,适当加上冗余字段,是能提升性能的

索引优化

判断是否走索引,看执行计划的KEY 是不是为空

desc 和 explain 都可以看执行计划,explain能快一点

执行计划中TYPE的说明👇
执行计划中TYPE的说明

1、避免在索引列上使用计算,避免使用函数,这样就会导致引擎放弃使用索引,避免在索引字段上用not,<>,!=,is null,is not null,避免数字转换,避免使用空值

2、如果对查询进行优化的话,要尽量避免全表扫描,首先应该考虑在where及order by 涉及的列上建立索引。

3、前缀索引
使用部分索引的原因有
1、char/varchar太长全部做索引的话,效率太差
2、blob/text类型不能整列作为索引列,因此需要使用前缀索引
前缀索引好处:MySQL 前缀索引能有效减小索引文件的大小,提高索引的速度。
前缀索引坏处:MySQL 不能在 ORDER BY 或 GROUP BY 中使用前缀索引,也不能把它们用作覆盖索引(Covering Index)。

4、模糊查询不走索引
使用了前%的模糊查询,不走索引,直接全表扫描,如果出现覆盖索引%在前面也会触发索引

5、最佳组合索引
建组合索引,是应该把区分度最高的字段放在前面

6、隐式转换不走索引
隐式转换不走索引

7、对于连续的数值,能用 between 就不要用 in 了,in或not in会全表扫描

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值