为什么MySQL查询速度慢?

2022-11-29 0 248



为什么MySQL查询速度慢

1.首先了解MySQL查询的执行过程

MySQL查询时,是由很多子任务组成的,每个子任务都会消耗一定的时间。如果要优化查询,其实就是优化它的子任务,可以去掉一些子任务,减少子任务的执行次数,让子任务执行得更快。

MySQL查询的执行过程:从客户端到服务器、然后在服务器进行解析、生成执行计划、执行、返回结果给客户端。

 

执行是最重要的阶段,包括调用存储引擎检索数据、调用后的数据处理、排序、分组等;

 

查询需要在不同的地方花费时间,包括网络、CPU计算、生成统计信息、生成执行计划、锁等待等,尤其是向底层存储引擎检索数据的调用操作,这些调用需要在内存操作、CPU操作和内存不足时导致的IO操作上花费时间。根据存储引擎不同,可能还会产生大量的上下文切换以及系统调用。

 

不必要的额外操作、不必要的重复操作、某些操作执行的太慢都是查询慢的原因,优化查询的目的就是减少和消除这些操作所花费的时间。

 

二、是否查询了不需要的数据

有些查询会查询很多不需要的数据,查询之后,程序中并未使用,这样不但会给MySQL服务器带来额外的负担,还会增加网络开销,也会消耗应用服务器的CPU和内存资源,简而言之,吃多少拿多少。

 

千万不要有​​“把数据都查出来,用Java代码过滤”​​的想法。

 

禁止使用​​select *​​进行查询。

 

三、衡量查询开销的几个重要指标

1、响应时间

响应时间可以分为服务时间和排序时间。

 

服务时间指数据库处理这个查询真正花费的时间;

排队时间指服务器因为等待某些资源而没有真正执行查询的时间,比如等待IO操作、等待行锁。

2、扫描的行数和返回的行数

较短的行的访问速度更快,内存中的行比磁盘中的行的访问速度要快得多。

 

理想情况下扫描的行数和返回的行数是相同的。但这种情况并不多见,比如关联查询的时候,服务器必须扫描更多的行才能得到结果,因此,越多的表关联,性能越低。

 

3、扫描的行数和访问类型

MySQL可以通过多种方式查询并返回结果集,速度从慢到快,扫描的行数由多到少,依次为全表扫描、索引扫描、范围扫描、索引扫描、常数引用。

 

最常用的优化方式是为查询增加一个合适的索引,索引可以让MySQL以效、扫描行数最少的方式找到需要的记录。

 

4、一般可以通过explain的Extra列查看查询的优劣

一般MySQL能够使用以下三种方式应用where条件,从好到坏依次为:

 

在索引中使用where条件过滤不匹配的记录,这是在存储引擎层完成的;

使用索引覆盖扫描,也就是Extra中出现Using index,直接从索引中过滤不需要的记录并返回命中的结果,这是在MySQL服务器层完成的,无须再回表查询记录;

Extra中出现Using where,这是在MySQL服务器层完成的,MySQL需要先从数据表读取记录,然后过滤。

Extra中出现​​Using where​​时,可以通过如下方式优化:

 

使用索引覆盖扫描,把所有需要的列都放到索引中,这样就不用回表查询了;

改变表结构,比如使用汇总表;

重写sql,让MySQL优化器能够以更优化的方式执行这个sql

1. 本站所有资源来源于用户上传和网络,因此不包含技术服务请大家谅解!如有侵权请邮件联系客服!cheeksyu@vip.qq.com
2. 本站不保证所提供下载的资源的准确性、安全性和完整性,资源仅供下载学习之用!如有链接无法下载、失效或广告,请联系客服处理!
3. 您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容资源!如用于商业或者非法用途,与本站无关,一切后果请用户自负!
4. 如果您也有好的资源或教程,您可以投稿发布,成功分享后有积分奖励和额外收入!
5.严禁将资源用于任何违法犯罪行为,不得违反国家法律,否则责任自负,一切法律责任与本站无关

源码下载

发表评论
暂无评论