我的编程空间,编程开发者的网络收藏夹
学习永远不晚

SQL慢的原因有哪些

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

SQL慢的原因有哪些

本篇内容主要讲解“SQL慢的原因有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“SQL慢的原因有哪些”吧!

SQL慢的原因有哪些

- 思维导图 -

写操作

作为后端开发,日常操作数据库最常用的是写操作和读操作。读操作我们下边会讲,这个分类里我们主要来看看写操作时为什么会导致 SQL 变慢。

刷脏页

脏页的定义是这样的:内存数据页和磁盘数据页不一致时,那么称这个内存数据页为脏页。

那为什么会出现脏页,刷脏页又怎么会导致 SQL 变慢呢?那就需要我们来看看写操作时的流程是什么样的。

对于一条写操作的 SQL 来说,执行的过程中涉及到写日志,内存及同步磁盘这几种情况。

SQL慢的原因有哪些

- Mysql 架构图 -

这里要提到一个日志文件,那就是 redo log,位于存储引擎层,用来存储物理日志。在写操作的时候,存储引擎(这里讨论的是 Innodb)会将记录写入到  redo log 中,并更新缓存,这样更新操作就算完成了。后续操作存储引擎会在适当的时候把操作记录同步到磁盘里。

看到这里你可能会有个疑问,redo log 不是日志文件吗,日志文件就存储在磁盘上,那写的时候岂不很慢吗?

其实,写redo log 的过程是顺序写磁盘的,磁盘顺序写减少了寻道等时间,速度比随机写要快很多( 类似Kafka存储原理),因此写 redo log  速度是很快的。

好了,让我们回到开始时候的问题,为什么会出现脏页,并且脏页为什么会使 SQL 变慢。你想想,redo log  大小是一定的,且是循环写入的。在高并发场景下,redo log 很快被写满了,但是数据来不及同步到磁盘里,这时候就会产生脏页,并且还会阻塞后续的写入操作。SQL  执行自然会变慢。

写操作时 SQL  慢的另一种情况是可能遇到了锁,这个很容易理解。举个例子,你和别人合租了一间屋子,只有一个卫生间,你们俩同时都想去,但对方比你早了一丢丢。那么此时你只能等对方出来后才能进去。

对应到 Mysql 中,当某一条 SQL 所要更改的行刚好被加了锁,那么此时只有等锁释放了后才能进行后续操作。

但是还有一种极端情况,你的室友一直占用着卫生间,那么此时你该怎么整,总不能尿裤子吧,多丢人。对应到Mysql  里就是遇到了死锁或是锁等待的情况。这时候该如何处理呢?

Mysql 中提供了查看当前锁情况的方式:

SQL慢的原因有哪些

通过在命令行执行图中的语句,可以查看当前运行的事务情况,这里介绍几个查询结果中重要的参数:

SQL慢的原因有哪些

当前事务如果等待时间过长或出现死锁的情况,可以通过 「kill 线程ID」 的方式释放当前的锁。

这里的线程 ID 指表中 trx_mysql_thread_id 参数。

读操作

说完了写操作,读操作大家可能相对来说更熟悉一些。SQL 慢导致读操作变慢的问题在工作中是经常会被涉及到的。

慢查询

在讲读操作变慢的原因之前我们先来看看是如何定位慢 SQL 的。Mysql 中有一个叫作慢查询日志的东西,它是用来记录超过指定时间的 SQL  语句的。默认情况下是关闭的,通过手动配置才能开启慢查询日志进行定位。

具体的配置方式是这样的:

查看当前慢查询日志的开启情况:

SQL慢的原因有哪些
  • 开启慢查询日志(临时):

SQL慢的原因有哪些
SQL慢的原因有哪些

注意这里只是临时开启了慢查询日志,如果 mysql 重启后则会失效。可以 my.cnf 中进行配置使其永久生效。

存在原因

知道了如何查看执行慢的 SQL 了,那么我们接着看读操作时为什么会导致慢查询。

(1)未命中索引

SQL 查询慢的原因之一是可能未命中索引,关于使用索引为什么能使查询变快以及使用时的注意事项,网上已经很多了,这里就不多赘述了。

(2)脏页问题

另一种还是我们上边所提到的刷脏页情况,只不过和写操作不同的是,是在读时候进行刷脏页的。

是不是有点懵逼,别急,听我娓娓道来:

为了避免每次在读写数据时访问磁盘增加 IO 开销,Innodb 存储引擎通过把相应的数据页和索引页加载到内存的缓冲池(buffer  pool)中来提高读写速度。然后按照最近最少使用原则来保留缓冲池中的缓存数据。

那么当要读入的数据页不在内存中时,就需要到缓冲池中申请一个数据页,但缓冲池中数据页是一定的,当数据页达到上限时此时就需要把最久不使用的数据页从内存中淘汰掉。但如果淘汰的是脏页呢,那么就需要把脏页刷到磁盘里才能进行复用。

你看,又回到了刷脏页的情况,读操作时变慢你也能理解了吧?

防患于未然

知道了原因,我们如何来避免或缓解这种情况呢?

首先来看未命中索引的情况:

不知道大家有没有使用 Mysql 中 explain 的习惯,反正我是每次都会用它来查看下当前 SQL 命中索引的情况。避免其带来一些未知的隐患。

这里简单介绍下其使用方式,通过在所执行的 SQL 前加上 explain 就可以来分析当前 SQL 的执行计划:

SQL慢的原因有哪些

执行后的结果对应的字段概要描述如下图所示:

SQL慢的原因有哪些

这里需要重点关注以下几个字段:

1、type

表示 MySQL 在表中找到所需行的方式。其中常用的类型有:ALL、index、range、 ref、eq_ref、const、system、NULL  这些类型从左到右,性能逐渐变好。

  • ALL:Mysql 遍历全表来找到匹配的行;

  • index:与 ALL 区别为 index 类型只遍历索引树;

  • range:只检索给定范围的行,使用一个索引来选择行;

  • ref:表示上述表的连接匹配条件,哪些列或常量被用于查找索引列上的值;

  • eq_ref:类似ref,区别在于使用的是否为唯一索引。对于每个索引键值,表中只有一条记录匹配,简单来说,就是多表连接中使用 primary key 或者  unique key作为关联条件;

  • const、system:当 Mysql 对查询某部分进行优化,并转换为一个常量时,使用这些类型访问。如将主键置于 where 列表中,Mysql  就能将该查询转换为一个常量,system 是 const类型的特例,当查询的表只有一行的情况下,使用system;

  • NULL:Mysql 在优化过程中分解语句,执行时甚至不用访问表或索引,例如从一个索引列里选取最小值可以通过单独索引查找完成。

2、possible_keys

查询时可能使用到的索引(但不一定会被使用,没有任何索引时显示为 NULL)。

3、key

实际使用到的索引。

4、rows

估算查找到对应的记录所需要的行数。

5、Extra

比较常见的是下面几种:

  • Useing index:表明使用了覆盖索引,无需进行回表;

  • Using  where:不用读取表中所有信息,仅通过索引就可以获取所需数据,这发生在对表的全部的请求列都是同一个索引的部分的时候,表示mysql服务器将在存储引擎检索行后再进行过滤;

  • Using temporary:表示MySQL需要使用临时表来存储结果集,常见于排序和分组查询,常见 group by,order by;

  • Using filesort:当Query中包含 order by 操作,而且无法利用索引完成的排序操作称为“文件排序”。

对于刷脏页的情况,我们需要控制脏页的比例,不要让它经常接近 75%。同时还要控制 redo log 的写盘速度,并且通过设置  innodb_io_capacity 参数告诉 InnoDB 你的磁盘能力。

总结

写操作

  • 当 redo log 写满时就会进行刷脏页,此时写操作也会终止,那么 SQL 执行自然就会变慢。

  • 遇到所要修改的数据行或表加了锁时,需要等待锁释放后才能进行后续操作,SQL 执行也会变慢。

读操作

  • 读操作慢很常见的原因是未命中索引从而导致全表扫描,可以通过 explain 方式对 SQL 语句进行分析。

  • 另一种原因是在读操作时,要读入的数据页不在内存中,需要通过淘汰脏页才能申请新的数据页从而导致执行变慢。

到此,相信大家对“SQL慢的原因有哪些”有了更深的了解,不妨来实际操作一番吧!这里是亿速云网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

SQL慢的原因有哪些

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

redis查询慢的原因有哪些

数据量过大:如果Redis中存储的数据量过大,查询时需要遍历大量的数据,导致查询速度变慢。内存不足:如果Redis的内存不足,系统会频繁进行内存的淘汰和数据的持久化,影响查询速度。频繁的数据更新:如果Redis中的数据频繁更新,可能会导致查
redis查询慢的原因有哪些
2024-03-02

win10启动慢的原因有哪些

Win10启动慢的原因可能有以下几种:1. 软件冲突: 安装了过多的软件或者一些软件之间冲突,会导致系统启动变慢。2. 启动项过多: 开机自启动项过多,会占用系统资源,导致启动变慢。3. 硬盘问题: 硬盘问题可能导致系统启动变慢,例如硬盘故
2023-08-30

win8电脑慢的原因有哪些

小编给大家分享一下win8电脑慢的原因有哪些,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!一、硬件问题按现在常规的电脑来说,WIN7系统至少要有2G才可正常行,但
2023-06-28

python运行慢的原因有哪些

Python运行慢的原因主要有以下几个方面:1. 解释型语言:Python是解释型语言,需要通过解释器将代码一行一行地解释执行,相比编译型语言(如C++)而言,执行速度会较慢。2. 动态类型:Python是一种动态类型语言,变量的类型在运行
2023-09-04

oracle delete很慢的原因有哪些

Oracle数据库delete语句执行慢的原因可能有以下几个方面:数据量过大:如果要删除的数据量非常大,删除操作会消耗大量的系统资源和时间,导致执行速度变慢。没有索引:如果要删除的数据表没有合适的索引,数据库系统将需要对整个表进行全表扫描,
oracle delete很慢的原因有哪些
2024-04-28

域名转接慢的原因有哪些

域名转接慢的原因可能有以下几个方面:1. DNS服务器的响应速度慢:DNS服务器是域名解析的核心,如果DNS服务器的响应速度慢,就会导致域名转接慢。2. 网络带宽不足:如果网络带宽不足,就会导致域名转接的速度变慢。3. 服务器负载过大:如果
2023-06-03

Linux系统卡慢的原因有哪些

Linux系统卡慢的原因可能有以下几个:1. 资源占用过多:系统运行过程中,某些进程占用了过多的CPU、内存或磁盘资源,导致系统变得缓慢。2. 进程冲突:系统中运行的进程之间可能存在冲突,导致系统响应变慢。3. 软件问题:某些软件可能存在缺
2023-09-22

ubuntu运行很慢的原因有哪些

Ubuntu运行缓慢的原因可能有以下几个方面:1. 系统资源不足:如果计算机的内存(RAM)、处理器(CPU)或硬盘空间不足,会导致系统运行缓慢。2. 运行过多的后台进程:如果后台运行的进程太多,会消耗系统资源,导致系统运行缓慢。3. 桌面
2023-09-07

windows下载速度慢的原因有哪些

本篇内容主要讲解“windows下载速度慢的原因有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“windows下载速度慢的原因有哪些”吧!下载速度慢的原因:一、网络最小宽带 这应该是造成网速
2023-07-01

python运行速度慢的原因有哪些

Python运行速度慢的主要原因有以下几个:解释性语言:Python是一种解释性语言,而不是编译性语言,这意味着每行代码都需要在运行时进行解释和执行,而不是事先编译成机器码。这会导致Python程序的运行速度比编译性语言慢。动态类型:Pyt
2023-10-25

SQL Server错误的原因有哪些

SQL Server错误的原因有以下几种:1. 语法错误:SQL语句语法错误,例如缺少关键字、拼写错误等。2. 运行时错误:SQL语句在执行过程中发生错误,例如除以零、列不存在等。3. 数据类型不匹配:SQL语句中使用了不匹配的数据类型,例
2023-09-23

Python中一条SQL语句执行得很慢的原因有哪些

Python中一条SQL语句执行得很慢的原因有哪些,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。说实话,这个问题可以涉及到 MySQL 的很多核心知识,可以扯出一大堆,就像要考
2023-06-02

电脑上网速度慢的原因有哪些

本篇内容主要讲解“电脑上网速度慢的原因有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“电脑上网速度慢的原因有哪些”吧!一:电脑系统病毒,引起病毒大量占用宽带引起这种情况最常见的就是以前上网速
2023-06-28

sqlserver查询突然很慢的原因有哪些

SQL Server 查询突然变慢可能有多种原因,以下是一些常见的原因:索引失效:如果查询涉及的表没有正确的索引,或者索引失效,会导致查询性能下降。硬件故障:服务器硬件故障、磁盘空间不足、内存不足等问题会导致查询性能下降。数据量增大:随着数
sqlserver查询突然很慢的原因有哪些
2024-04-09

电脑开机速度慢的原因有哪些

这篇文章主要介绍“电脑开机速度慢的原因有哪些”,在日常操作中,相信很多人在电脑开机速度慢的原因有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”电脑开机速度慢的原因有哪些”的疑惑有所帮助!接下来,请跟着小编
2023-06-28

编程热搜

目录