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

一条SQL语句执行很慢的可以分两种情况:

(1)大多数情况是正常的,只是偶尔会出现很慢的情况。
(2)在数据量不变的情况下,这条SQL语句一直以来都执行的很慢。

针对情况1的原因:

1. 数据库在刷新脏页:在往数据库插入或者更新一条数据的时候,我们知道数据库会在内存中把对应的字段更新了,但是更新之后,这些更新的字段并不会马上同步持久化到磁盘中,而是把这些更新的记录写入到redo log日志中去,等到空闲的时候,再通过redo log日志把最新的数据同步到磁盘中去。(备注:当内存数据页跟磁盘数据页内容不一致时,我们成这个内存页为“脏页”,当内存数据刷新到磁盘后,内存和磁盘的数据一致时,就称为“干净页”)
刷脏页有以下几种场景
(1)redo log 日志写满了:redo log日志里的内容是很有限的,如果数据库一直很忙,更新又很频繁,这个时候redo log很快就被写满了,这个时候就没办法等到空闲的时候再把数据同步到磁盘中去,只能暂停其他操作,全身心的把数据同步到磁盘中,而此时就会导致平时正常的SQL语句突然执行的很慢。
(2)内存不够用了:如果一次性查询较多的数据,而且恰好碰到所查询的数据页不在内存中,需要申请内存,而此时恰好内存不足的时候就要淘汰一部分内存数据页,如果是干净页就直接释放,如果恰好是脏页就要刷脏页。
(3)MySQL认为系统“空闲”的时候:这时候系统没什么压力。
(4)MySQL正常关闭的时候:这时候,MySQL会把内存的脏页都flush到磁盘上,这样下次MySQL启动的时候,就可以直接从磁盘上读取数据,启动速度会很快。
2. 拿不到锁 我们要执行的这条SQL语句涉及到的表刚好别人在用,并且加锁了,我们拿不到锁,只能慢慢等待别人释放锁了。如果要判断是否真的在等待锁,可以使用 show processlist 这个命令来查看当前的状态。

针对情况2的原因:如果数据量一样的情况下,这条SQL语句每次都执行的很慢,那就是SQL语句书写的不理想
  • 我们先假设有一张表
mysql> CREATE TABLE 't'(
'id' int(11) NOT NULL,
'c' int(11) DEFAULT NULL,
'd' int(11) DEFAULT NULL,
PRIMARY KEY('id')
)ENGINE = InnoDB;
  1. 没有用到索引:
select * from t where c = 1;

如果给c列加上索引:

create index c_index on t('c');
  1. 该字段有索引,但是没有用到索引(对索引列使用运算)
select * from t where c - 1 = 1000;
正确使用索引的查询应该如下:
select * from t where c = 1000 + 1;
  1. 使用函数导致没有用上索引
select * from t where pow(c,2) = 1000;
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值