首页 > 数据库 >MySQL进阶实战5,为什么查询速度会慢

MySQL进阶实战5,为什么查询速度会慢

时间:2022-11-30 23:11:07浏览次数:46  
标签:进阶 扫描 会慢 查询 索引 行数 MySQL 执行

一、先了解一下MySQL查询的执行过程

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

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

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

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

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

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

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

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

禁止使用select * 进行查询。

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

1、响应时间

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

  • 服务时间指数据库处理这个查询真正花费的时间;
  • 排队时间指服务器因为等待某些资源而没有真正执行查询的时间,比如等待IO操作、等待行锁。

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

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

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

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

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

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

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

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

  1. 在索引中使用where条件过滤不匹配的记录,这是在存储引擎层完成的;
  2. 使用索引覆盖扫描,也就是Extra中出现Using index,直接从索引中过滤不需要的记录并返回命中的结果,这是在MySQL服务器层完成的,无须再回表查询记录;
  3. Extra中出现Using where,这是在MySQL服务器层完成的,MySQL需要先从数据表读取记录,然后过滤。

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

  1. 使用索引覆盖扫描,把所有需要的列都放到索引中,这样就不用回表查询了;
  2. 改变表结构,比如使用汇总表;
  3. 重写sql,让MySQL优化器能够以更优化的方式执行这个sql;

标签:进阶,扫描,会慢,查询,索引,行数,MySQL,执行
From: https://www.cnblogs.com/nezhaSoft/p/16940133.html

相关文章

  • Hive进阶
    title:Hive进阶cover:/cover_imgs/hive.pngtags:-Hivecategories:-Hive第1章 Explain查看执行计划(重点)1.1基础语法EXPLAIN[EXTENDED|DEPENDENCY|AUT......
  • mysql
    MySQL教程mysqlMySQL是最流行的关系型数据库管理系统,在WEB应用方面MySQL是最好的RDBMS(RelationalDatabaseManagementSystem:关系数据库管理系统)应用软件之一。......
  • IIS报错:未能加载文件或程序集MySql.ConnectorInstaller, Version=8.0.8.0, Culture=ne
    删除machine.config中相关配置<siteMap><providers><addname="MySqlSiteMapProvider"type="MySql.Web.SiteMap.MySqlSiteMapProvider,MySql.ConnectorInstal......
  • 肖sir__mysql__插入时间
    createtablet1( idint(11)NOTNULLAUTO_INCREMENTPRIMARYKEY, d1_datadate, d2_timetime, d3_datatimedatetime, d4_yearyear, d5_timestampTIMESTAMP);INS......
  • MySQL补充知识及索引
    昨日内容回顾多表查询的关键字innerjoin...on...leftjoin...on....rightjoin...on...SQL关键字补充concat/concat_ws/add/change/modify多表查询实操方式......
  • MySQL常用函数-24课-2022-11-30
    --====================常用函数==============================--数学运算SELECTABS(-80)--绝对值SELECTCEILING(9.4)--向上取整SELECTFLOOR(9.4)--向下......
  • MYSQL高级语言(一)
    引言MySQL常用的sql语言为(增删改查),其中查最为常用,对MySQL数据库的查询,除了基本的查询外,有时候需要对查询的结果集进行处理。例如只取特定条数据、对查询结果进行排序......
  • MySQL备份及恢复
    一、为什么要数据备份备份的主要目的是灾难恢复,在生产环境中,数据的安全性至关重要,任何数据的丢失都可能产生严重的后果。造成数据丢失的原因程序错误人为操作错误运......
  • MySQL源码编译安装
    MySQL源码编译安装Linux环境:CentOS7.6MySQL版本:MySQL5.7.37安装路径:/usr/local/mysql1.创建相关目录#创建用户useradd-s/sbin/nologinmysql#创建安装目录并......
  • MySql存储过程
    定义存储过程格式:createprocedure存储过程名(参数)begin...select要返回的内容;end;1定义一个简单的存储过程createproceduretest()begin select*fr......