造成SQL语句执行很慢的原因分析

一条SQL语句执行很慢,在实际情况下可能会经常遇到。这里需要分两种情况讨论:相同的SQL语句偶尔执行很慢;SQL语句每次执行都很慢。

SQL语句偶尔执行很慢

SQL语句偶尔执行很慢,说明不是SQL语句本身的问题,即数据库在执行SQL语句时出现了问题。
我们深入了解MySQL数据库执行与原理可以知道,MySQL执行数据库的写操作并不是立即就将数据写回磁盘,而是先写入redolog日志文件中(redolog是InnoDB存储引擎所独有),但是redolog日志不能无限制增大,需要定期将redolog中的内容写入磁盘以保证持久化。当MySQL的写操作频繁,导致redolog日志快要满了的时候,MySQL无法等待空闲时间写磁盘,由于磁盘操作比较耗时并且redolog文件较大时,系统就会阻塞SQL语句以保证写磁盘操作顺利进行。此时就会出现SQL语句执行很慢的情况。另外当数据库内存满了的时候,会发生缺页中断,操作系统采用置换算法淘汰部分页面,如果淘汰的页面数据未被修改,直接淘汰即可,如果发生了修改,还要把脏页面写到磁盘中,这样同样引发写磁盘操作,导致SQL语句执行很慢;其次,MySQL使用有很多锁机制应对并发同步问题,当需要执行的SQL语句与其他正在执行的事件发生互斥,则会导致SQL语句被阻塞,当前SQL语句等待对方释放锁从而导致执行很慢。

SQL语句每次执行都很慢

SQL语句每次执行都很慢,说明SQL语句不合理。索引是加快SQL查询的手段之一,如果SQL语句执行很慢,可能是SQL中没有加索引,或者虽然加了索引,MySQL并没有使用索引,而去执行全表扫描。
另外一种特殊情况是:数据库系统自己使用错了索引。对数据库加了索引,数据库系统会根据索引选择使用索引或者全表扫描。索引的区分度用来衡量索引中非重复元素的比例,如果非索引中非重复值比例很大,那么用该索引来执行查询的效率就越高。数据库系统怎么判断索引的区分度呢?通过采样的方式计算区分度。既然通过采样,那么就会出错,加入索引的区分度很大,但是采样区间的区分度很小,那么数据库系统就会错误地认为该索引的区分度很小,从而选择全表扫描执行SQL语句。这就是数据库错误使用索引的例子。

总结

  • 如果SQL偶尔执行很慢可能的原因:1. redolog日志满了;2. 内存满了;3. 执行SQL时遇到了锁;
  • 如果SQL语句每次执行后很慢的原因:1. 没有加索引;2. 加了索引但是由于SQL语句不合理导致MySQL未能使用索引;3. 数据库系统错误使用了索引。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值