关于sql语句执行很慢的原因
- 大部分时间是正常的 ,只有偶尔会出现很慢的状态
- 在数据量不变 的状态下,这条sql语句一直执行的很慢
下面针对这两种情况,我们来具体分析一下
-
针对偶尔很慢的状态
首先我觉得这条sql语句本身没有什么问题,而是其他原因导致了很慢,那会是什么样的原因呢?
1.数据库刷新脏页
当我们插入 一条数据或者更新一条数据的 时候,我们知道数据库会在内存中将相应的数据更新,但在更新之后,这些更新的字段不会马上同步持久化到磁盘中,而是把这些更新的记录写到redo log日记中去,等到有空的时候,通过redo log里的 日记把最新的数据同步到磁盘中。
不过redo log中是有限的 ,我们如果数据库一直很忙,一直在更新频繁,那么很快就会把日记写满,这时候没法等空闲的 时候同步到磁盘中去,而是会全身心的同步磁盘,这样可能会导致我们平时的sql语句突然很慢。
2.拿不到锁
这个就比较好理解了,我们执行这条语句的时候,刚好涉及到的表,别人在用,并且加上了 锁,这样我们就拿不到锁,只能慢慢等待别人释放锁
如果要判断是否真的在等待锁了,我们可以通过show processlish来查看当时的状态。
3.内存不够用了 -
针对一直很慢的状态
如果针对数据量不变的情况下,sql语句执行一直很慢,那么就得好好考虑sql语句的书写 了 。
下面分析哪些条件可能会导致sql语句的执行很不理想
1.没有用到索引
例如 改字段没有用索引,由于对该字段进行运算,函数 ,没有用到索引
2.数据库选错了 索引