我是靠谱客的博主 搞怪大炮,最近开发中收集的这篇文章主要介绍一条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;

最后

以上就是搞怪大炮为你收集整理的一条SQL语句执行很慢的原因有哪些?的全部内容,希望文章能够帮你解决一条SQL语句执行很慢的原因有哪些?所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(61)

评论列表共有 0 条评论

立即
投稿
返回
顶部