为什么MySQL查询速度会慢

 更新时间:2022年12月01日 08:19:57   作者:哪吒编程  
这篇文章主要介绍了为什么MySQL查询速度会慢的相关资料,需要的朋友可以参考下

一、先了解一下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;

到此这篇关于为什么MySQL查询速度会慢的文章就介绍到这了,更多相关MySQL查询速度慢内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 关于MySQL中datetime和timestamp的区别解析

    关于MySQL中datetime和timestamp的区别解析

    在MySQL中一些日期字段的类型选择为datetime和timestamp,那么对于这两种类型不同的应用场景是什么呢,这篇文章主要介绍了关于MySQL中datetime和timestamp的区别解析,需要的朋友可以参考下
    2023-06-06
  • win10 mysql导出csv的两种方式

    win10 mysql导出csv的两种方式

    win10导出csv有两种方式,第一种是借助工具,第二种是原始SQL语句导出,这篇文章主要介绍了win10 mysql导出csv的两种方式,需要的朋友可以参考下
    2019-12-12
  • MySQL UPDATE 语句的非标准实现代码

    MySQL UPDATE 语句的非标准实现代码

    这篇文章主要介绍了MySQL UPDATE 语句的非标准实现代码,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-04-04
  • MySQL中的各种查询问题

    MySQL中的各种查询问题

    这篇文章主要介绍了MySQL中的各种查询问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-01-01
  • MYSQL随机抽取查询 MySQL Order By Rand()效率问题

    MYSQL随机抽取查询 MySQL Order By Rand()效率问题

    MYSQL随机抽取查询:MySQL Order By Rand()效率问题一直是开发人员的常见问题,俺们不是DBA,没有那么牛B,所只能慢慢研究咯,最近由于项目问题,需要大概研究了一下MYSQL的随机抽取实现方法
    2011-11-11
  • MySQL Innodb关键特性之插入缓冲(insert buffer)

    MySQL Innodb关键特性之插入缓冲(insert buffer)

    这篇文章主要介绍了MySQL Innodb关键特性之插入缓冲的相关资料,帮助大家更好的理解和学习使用Innodb存储引擎,感兴趣的朋友可以了解下
    2021-04-04
  • MySQL中的长事务示例详解

    MySQL中的长事务示例详解

    这篇文章主要给大家介绍了关于MySQL中长事务的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用MySQL具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-09-09
  • mysql 中存在null和空时创建唯一索引的方法

    mysql 中存在null和空时创建唯一索引的方法

    据库默认值都有null,此时创建唯一索引时要注意了,此时数据库会把空作为多个重复值
    2014-10-10
  • MySQL 5.6下table_open_cache参数优化合理配置详解

    MySQL 5.6下table_open_cache参数优化合理配置详解

    这篇文章主要介绍了MySQL 5.6下table_open_cache参数合理配置详解,需要的朋友可以参考下
    2018-03-03
  • mysql 5.5 安装配置方法图文教程

    mysql 5.5 安装配置方法图文教程

    这篇文章主要为大家分享了mysql 5.5安装配置方法图文教程,感兴趣的朋友可以参考一下
    2016-11-11

最新评论