【【MySQL数据库】一条数据库】一条SQL语句为什么执行这么慢?语句为什么执行这么慢?
面试高频题目,一条SQL语句为什么执行这么慢? 这其中涉及的知识也是各种各样,今天就让我们来完全剖析这个问题。
一条一条SQL语句为什么执行这么慢?语句为什么执行这么慢?一、执行偶尔变慢1. 刷脏页,写磁盘2. 还在等锁3. 回滚日志过多二、执行总是很慢1. 没有
索引2. 对字段进行函数操作3. 选错索引
一、执行偶尔变慢一、执行偶尔变慢
有的时候,明明执行的是同一条语句,之前执行还挺快的,但忽然某一次就像“卡住了一样”需要很久才能返回结果,甚至是长
时间不返回。出现这种情况呢,就需要考虑以下两种情况:
1. 刷脏页,写磁盘刷脏页,写磁盘
首先说明脏页的概念:当内存数据页跟磁盘数据页内容不一致的时候,我们称这个内存页为“脏页脏页”。内存数据写入到磁盘后,
内存和磁盘上的数据页的内容就一致了,称为“干净页干净页”。
通常情况下,我们对于数据的操作都是将数据从磁盘中加载到内存中后,在内存中进行修改的。而修改后也并不是直接就将内
存中的脏页刷回到磁盘中。什么情况下会进行刷脏页的操作呢?
redo log写满了,要写满了,要flush脏页脏页,前面我们讲过,MySQL操作时会写redo log,而且redo log 的大小时有限的,那么就会出现
写满了的情况,此时,就不得不将redo log中的数据刷回到磁盘中。这种情况是InnoDB要尽量避免的。因为出现这种情况的时
候,整个系统就不能再接受更新了,所有的更新都必须堵住。
内存不够用了,要先将脏页写到磁盘内存不够用了,要先将脏页写到磁盘,这种情况其实是常态。InnoDB用缓冲池(buffer pool)管理内存,缓冲池中的内存页
有三种状态:
第一种是,还没有使用的;
第二种是,使用了并且是干净页;
第三种是,使用了并且是脏页。
而当要读入的数据页没有在内存的时候,就必须到缓冲池中申请一个数据页。如果内存不够,就要把最久不使用的数据页从内
存中淘汰掉,如果是刚好是脏页呢,就必须将脏页先刷到磁盘,变成干净页后才能复用。
系统处于空闲时刻系统处于空闲时刻,在系统处于空闲时刻时,就会将刷脏页操作安排起来。
MySQL正常关闭时刻正常关闭时刻,在关闭时刻,系统会将内存中的脏页都刷回磁盘,保证下次使用可以直接使用数据。
对于第三四种情况,明显不是在执行SQL语句导致慢的原因,重点影响效率的就是第一种和第二种情况。
评论0