首页 > 数据库 >mysql优化sql:EXPLAIN各语法解释:

mysql优化sql:EXPLAIN各语法解释:

时间:2024-08-01 14:56:23浏览次数:9  
标签:index EXPLAIN mysql 扫描 查询 索引 sql 优化

当我们谈论数据库性能优化时,EXPLAIN 是一个非常有用的工具,用于分析查询语句的执行计划。它能帮助我们理解数据库是如何执行查询的,以及是否能有效利用索引和其他优化策略。下面是一些关键的概念和术语,帮助你理解如何分析 EXPLAIN 的输出以优化查询性能:

1. 执行计划基础

执行 EXPLAIN 查询的基本语法是:

EXPLAIN SELECT ......  ;

这会返回一个描述查询执行计划的结果集。每一行都代表执行计划中的一步操作,通常是从最内层到最外层。

2. 关键字段解释

在分析 EXPLAIN 输出时,需要注意以下关键字段:

  • id:  操作的唯一标识符,通常从 1 开始递增。多个操作可能共享相同的 id,表示它们在同一层级。
    • id不同,在所有组中,id值越大,优先级越高,越先执行 。
    • id相同,都是1,从上到下顺序执行。

 

  • select_type:  操作的类型,例如 SIMPLEPRIMARYSUBQUERY 等。不同类型反映了不同的查询结构和优化方式。
    • 查询类型,主要用于区别普通查询,联合查询,子查询等复杂查询结果值。
    • SIMPLE: 简单select查询,查询中不包含子查询或者UNION。
    • PRIMARY: 查询中若包含任何复杂的子查询,最外层查询则被标记为primary
    • SUBQUERY: 在select或where中包含了子查询。
    • DERIVED: 在from列表中包含的子查询被标记为derived(衍生)把结果放在临时表当。
    • UNION: 若第二个select出现的union之后,则被标记为union ,若union包含在from子句的子查询中,外层select将被标记为deriver
    • UNION RESULT: 从union表获取结果select,两个UNION合并的结果集在最后。
    •  
  • table:  操作涉及的表。

 

  • type:  访问类型,表示如何访问表,常见的类型有 ALL(全表扫描)、index(索引扫描)、range(范围扫描)等。
    • 结果值:(最好到最差) system > const > eq_ref > ref > range > index > ALL
    • system 表中有一行记录(系统表) 这是const类型的特例,平时不会出现。
    • const 表示通过索引一次就找到了,const用于比较primary 或者 unique索引。
    • eq_ref  唯一性索引扫描 对于每个索引键,表中只有一条记录与之匹配, 常见于主键或唯一索引扫描
    • ref 非唯一性索引扫描。
    • range 只检索给定范围的行,使用一个索引来选择行 一般就是在你的where语句中出现between<>\ in等查询。
    • index 与 All 区别为 index 类型只遍历索引树,通常比 All 要快,因为索引文件通常比数据文件要小,all和index都是读全表,但index是从索引中读取,all是从硬盘当中读取。
    • ALL 将全表进行扫描,从硬盘当中读取数据,如果出现了All 切数据量非常大, 一定要去做优化。
    •  
  • possible_keys:  可能使用的索引列表。
  • key:  实际使用的索引。
  • key_len:  索引字段的长度。
  • ref:  显示索引如何与表中的列值匹配。
    • 索引是否被引入到, 到底引用到了哪几个索引。
    •  
  • rows:  预计要检索/扫描的行数。
    •   根据表统计信息及索引选用情况,大致估算出找到所需的记录所需要读取的行数,每长表有多少行被优化器查询过。
    •  
  • filtered:满足查询的记录数量的比例,注意是百分比,不是具体记录数 . 值越大越好,filtered列的值依赖统计信息,并不十分准确。 

 

  • Extra:  额外信息,如 Using where(表示使用了 WHERE 条件过滤结果)、Using index(表示查询使用了覆盖索引)等。
    •   Using Filesort 和 Using Temporary:说明没有使用到索引。
    •        impossible where:说明条件永远不成立。
    •        use index:表示相应的select中使用了覆盖索引,避免访问了表的数据行, 效率很好
    •        using where:表明使用了where过滤。
    •        using join buffer:使用了连接缓存。

 

3. 分析常见问题和优化建议

在分析 EXPLAIN 输出时,可以根据以下常见问题和优化建议进行评估:

  • 全表扫描(ALL):如果 type 列显示为 ALL,表示查询执行全表扫描,这通常是性能问题的原因。可以考虑优化查询或添加合适的索引来避免全表扫描。

  • 索引未使用(NULL key):如果 key 列为 NULL,表示查询没有使用索引,可能需要调整查询或者添加新的索引。

  • 索引选择不当type 列显示 rangeref 时,可能表示索引选择不当,考虑是否需要调整索引以提高效率。

  • 额外信息(Extra)Extra 列提供了额外的执行信息,如 Using whereUsing indexUsing temporary 等,这些信息可以帮助理解查询的具体执行情况。

4. 优化查询的步骤

基于 EXPLAIN 的输出,优化查询的一般步骤包括:

  • 确认查询是否使用了预期的索引。
  • 确保统计信息是最新的,以便优化器可以做出准确的执行计划选择。
  • 根据 EXPLAIN 输出中的访问类型和扫描行数来调整索引设计或者查询本身的结构。
  • 避免在大表上进行全表扫描,尽可能使用索引来减少数据检索的成本。

通过理解和分析 EXPLAIN 的输出,可以有针对性地改进查询性能,使得数据库操作更加高效和可靠。

标签:index,EXPLAIN,mysql,扫描,查询,索引,sql,优化
From: https://www.cnblogs.com/lgg20/p/18336673

相关文章

  • ETL数据集成丨快速将MySQL数据迁移至Doris数据库
    随着大数据技术的迅速发展,越来越多的企业开始寻求高效、灵活的数据存储与分析解决方案。ApacheDoris(原名Palo)作为一款高性能的MPP(大规模并行处理)分析型数据库,凭借其在OLAP场景下的卓越表现,逐渐成为数据仓库和商业智能领域的优选方案之一。本文旨在详细介绍如何利用ETLCloud平台,......
  • 四、MySQL函数
    MySQL函数常用函数SELECTNOW()SELECTCURDATE()聚合函数函数名称描述COUNT()计数SUM()求和AVG()平均值MAX()最大值MIN()最小值......--聚合函数--都能统计表中的数据(想查询一个表中有多少记录,使用count)SELECTCOUNT(borndate)FR......
  • 超详细的MySQL CRUD 并配备了大量的测试用例, 包教包会
    MySQL数据库表的增删查改CRUD:Create(创建),Retrieve(读取),Update(更新),Delete(删除)Create​INSERT[INTO]table_name[(column[,column]…)]VALUES(value_list)[,(value_list)]…value_list:value,[,value]…insert语句主要有两种情况,一种是全行插......
  • 使MySQL 8.5支持“Asia/Shanghai”格式时区配置
    默认情况下,MySQL不支持设置“Asia/Shanghai”格式时区信息,如根据数据记录的时区信息去转换时间时,会发生意想不到的空。“表达式1”会返回正常的时间转换结果:--表达式1SELECTCONVERT_TZ('2024-08-0111:04:04','+00:00','+08:00');“表达式2”会返回NULL:--表达式2SELE......
  • ctfhub-sql注入-injection-解题思路
    1.打开题目,判断是数字型注入还是字符型注入    1.输入1’  //无回显        1‘ --+//也是没有回显        1”  //无回显        1“--= //无回显都没有回显,所以判断为数字型注入2.使用命令进行判断......
  • nodejs 使用 sequelize 实现 mysql数据库的批量插入
    直接上代码:/***设置mysql连接,返回连接实例。连接格式:账户:密码@数据库地址/具体数据库名称***/constsetConnect=()=>{constsequelize=newSequelize(`mysql://${你的mysql地址}`,{logging:(...msg)=>Logger.INSTANCE.inf......
  • 从MySQL大量数据清洗到TiBD说起
    一、业务背景公司主要做的业务是类似贝壳的二手房租售,数据库中存了上亿级别的房源数据,之前数据库使用的是mysql,后面需要将mysql数据库切换成了Tidb,在切换的过程中,需要将老库的数据经过数据清洗后再存入新库(因为有一些表结构的设计变了),其中我们处理的一个逻辑就是将房间......
  • 【漏洞复现】用友时空KSOA PrintZPFB.jsp SQL注入漏洞
    0x01产品简介用友时空KSOA是建立在SOA理念指导下研发的新一代产品,是根据流通企业前沿的IT需求推出的统一的IT基础架构,它可以让流通企业各个时期建立的IT系统之间彼此轻松对话。0x02漏洞概述用友时空KSOA系统PrintZPFB.jsp接口处存在SQL注入漏洞,未经身份验证的......
  • MySQL安装教程(保姆级)
    1.首先要了解自己的计算机打开设置——系统——系统信息然后就可以知道自己计算机的类型了。2.下载MySQL2.1.来到MySQL官网点击进入我们下拉页面,可以找到DOWNLOADS页面默认给咱们选择最新的版本,咱们不用,咱们尽量选一个稳定的版本。而且,版本过高后,就没......
  • mysql复习
     一、DELETE和TRUNCATE的用法DELETE用法DELETE命令用于从数据表中删除指定的记录。其基本语法如下:DELETEFROM表名WHERE条件;示例:DELETEFROMemployeesWHEREemployee_id=100;上述示例将从employees表中删除employee_id为100的记录。......