一条sql语句执行很慢的原因有哪些

一条sql语句执行的很慢的话,可以大体上分两种情况,一种是偶尔执行的慢,一种是总是执行的慢。

偶尔执行的慢

  • 可能是数据库此时在刷脏页。脏页就是内存中的数据跟磁盘上的数据不一致,数据库先写内存,并把修改操作记录到redo log,等空闲的时候再将redo log中的数据刷新到磁盘上,如果此时redo log 已经满了,那就不得不刷脏页了,或者内存不够,就得需要清除部分内存,如果清除的是干净页,那就可以直接清除,如果是脏页,就得先刷新到磁盘中才能清除。
  • 可能是我们要查询的数据表加了锁,此时锁已经被占有,我们拿不到锁,就得等待了。

总是执行的慢

  • 可以用explain看一下sql语句的执行计划,是不是没有用到索引,或者是不是没有选择最优的索引,数据库对索引的选择有很多考虑方面,并不是每次都会选到最优索引。
  • 检查sql语句是不是对索引字段使用了函数操作导致索引失效,或者是不是加载了很多不必要的数据。
  • 可能是数据量太大,就需要进行大表优化:可以对数据进行范围限制;读写分离,主数据库负责写,从数据库负责读;可以对数据表进行垂直拆分或者水平拆分。

补充:

  • 垂直拆分:拆分的是列,可以将一个有很多列的表进行垂直拆分,拆分后的表的列数变少,在查询时可以减少io次数,而且简化了表的结构,方便维护;由于拆分后的每个表都需要有个主键,所以会出现主键冗余,需要join连接。
  • 水平拆分:拆分的是行,一个数据表可能会有非常多的行,将行拆分到不同的表中,一般不建议水平拆分。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值