热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Explain如何助力SQL语句的优化及其分析方法

本文介绍了Explain如何助力SQL语句的优化以及分析方法。Explain是一个数据库SQL语句的模拟器,通过对SQL语句的模拟返回一个性能分析表,从而帮助工程师了解程序运行缓慢的原因。文章还介绍了Explain运行方法以及如何分析Explain表格中各个字段的含义。MySQL5.5开始支持Explain功能,但仅限于select语句,而MySQL5.7逐渐支持对update、delete和insert语句的模拟和分析。

Explain如何助力SQL语句的优化

    • 何为Explain
    • 怎样运行Explain
    • 如何分析Explain的表格
    • 利用EXPLAIN对SQL优化

何为Explain

Explain是本菜几天前才接触到的内容,做一篇blog梳理梳理自己现在这几天所学的内容。
Explain本质上是一个数据库SQL语句的模拟器,他通过对SQL语句的模拟,返回一个SQL语句的性能分析表,根据这张表的内容,工程狮可以具体了解到为啥我的程序这么慢了。第一款支持 explain功能的是MySQL 5.5,但是初始级的explain只提供对于select语句的模拟,随后到MySQL 5.7,才逐渐支持对于后续update,delete和insert语句的模拟和分析。

怎样运行Explain

运行Explain 语句非常简单,一般是explain+SQL代码。
《Explain如何助力SQL语句的优化》
返回一张SQL语句的分析表。
《Explain如何助力SQL语句的优化》

如何分析Explain的表格

分析一张explain的表格就要知道其各个字段名的含义
explain表格分别有id, select_type, table, partitions, type, possible keys, key, key_len, ref, rows, filtered, extras 12个字段
±—±————-±——±———–±—–±————–±—±—–±———-+
| id | select_type | table| partitions | type | possible_keys | key | key_len |
±—±————-±——±———–±—–±————–±—±—–±———-+
±—-±——±——–±——-+
|ref | rows | filtered | Extra |
±—±——±——–±——+

Id: 返回的是检索表格的序列号,每增加一次子查询,id值+1,数字越大越优先执行。

select_type 反应的是表格类型

Simple简单的SQL语句,没有union和子查询的使用
PRIMARY最外层的SQL查询
SUBQUERY在 where 之后进行的子查询
DERIVED在 from 之后进行的子查询
UNION被联合查询的表格,也就是SQL语句中的第二个表格
UNION DEPENDENT这是在被联合查询的表格有子查询的情况下的类型

同时select_type 还有insert,update和delete字段,分别表明explain分析的是这几种语句。

tables 表名。

Partitions 如果查询是基于分区表的,会在这里标明。

type 指的是表内的访问方式,换句话说是数据库怎样查询这张表的,是通过全表查询得到结果,还是通过索引查询得到部分结果。
type总共有14种之多,但是最常见的一共有几种,分别all,index,range,ref,eq_ref,const,排序是从劣到优进行排列

  1. ALL/SYSTEM:
    是全表查询,在Innodb数据库引擎中用All表示,在其他数据库引擎中用SYSTEM来表示,全表查询是最暴力的查询方式,一般出现在select
    *的语句中,出现这种情况可以加索引进行查找。

  2. INDEX:
    是按照索引来进行全表查询,只不过是按照索引的顺序来查找的,速度比前一种方式还要慢,因为数据库在扫描前表的时候需要读取索引,出现这种情况可以考虑根据需求重新设计SQL,固定到一段表格中进行查询然后返回需要的结果。

    《Explain如何助力SQL语句的优化》
    这种情况会导致INDEX的出现,其中blog_name是索引。

  3. RANGE: 从range开始,程序就可以使用此种性能的SQL了,range是指有范围的对索引项进行扫描,一般出现在索引加 ‘<’,’>’, in, or,between…and…等情况中,range虽然可以应用在SQL查询中,但仍然不是一个好的选择。

    《Explain如何助力SQL语句的优化》
    表中的数据必须要有不符合SQL条件的其类型才会变为range,否则其类型为index,如果表中所有数据的blog_number小于2,类型为index,如果有数据大于或等于2,类型为range。

  4. REF: 查找条件列为索引但是不是唯一索引或主键,如果数据中有重复的值,其类型为ref。
    《Explain如何助力SQL语句的优化》 REF和 RANGE的区别在于一个查找于区间范围,一个查找于固定的值。

  5. REF_EQ:在ref_eq中查找列通过数据库得知返回的结果集只有一个值,则可达到REF_EQ的标准,也就是说当我们查询主键或唯一键的时候,SQL语句就达到了REF_EQ的标准。为了提升数据库性能,我们可以通过拆解字段名的方式,达到唯一键的标准,通过唯一键查询数据库,速度会大大加快。
    《Explain如何助力SQL语句的优化》
    当blog_number为唯一键即达到此标准。

  6. CONST:当主键作为where之后的条件查询的时候,mysql会通过优化器将其优化为在常量时间内完成的SQL,此时SQL为CONST。

possible_keys : 显示此表中的所有索引。

key: 实际使用到的索引,为空则表示没有索引。

key_len: 索引的长度,一般是要控制在20以内,长度为20字节的索引其区分度能够在90%以上,足够使用。

rows: 表示查询到结果集需要查询多少行元数据。

filter: 查找记录占总记录的百分比

利用EXPLAIN对SQL优化

我们可以通过type的定义对SQL进行优化,如果SQL为INDEX型,我们可以根据业务逻辑缩小查找范围进行优化; 如果其为range类型,尽量将索引的的范围查找变为等值查找,如果必须为范围查找,则可以将其设为主键,这样其SQL为CONST类型,非常快捷。

同时explain表返回的索引字段名长度可以帮助程序猿判断程序是否过长而影响性能。一般情况下索引长度为20的时候既可以区分90%的数据。


推荐阅读
  • 本文深入探讨 MyBatis 中动态 SQL 的使用方法,包括 if/where、trim 自定义字符串截取规则、choose 分支选择、封装查询和修改条件的 where/set 标签、批量处理的 foreach 标签以及内置参数和 bind 的用法。 ... [详细]
  • 解读MySQL查询执行计划的详细指南
    本文旨在帮助开发者和数据库管理员深入了解如何解读MySQL查询执行计划。通过详细的解析,您将掌握优化查询性能的关键技巧,了解各种访问类型和额外信息的含义。 ... [详细]
  • 本文介绍如何通过创建替代插入触发器,使对视图的插入操作能够正确更新相关的基本表。涉及的表包括:飞机(Aircraft)、员工(Employee)和认证(Certification)。 ... [详细]
  • 本文详细介绍了 MySQL 中 LAST_INSERT_ID() 函数的使用方法及其工作原理,包括如何获取最后一个插入记录的自增 ID、多行插入时的行为以及在不同客户端环境下的表现。 ... [详细]
  • 深入理解 SQL 视图、存储过程与事务
    本文详细介绍了SQL中的视图、存储过程和事务的概念及应用。视图为用户提供了一种灵活的数据查询方式,存储过程则封装了复杂的SQL逻辑,而事务确保了数据库操作的完整性和一致性。 ... [详细]
  • PHP 编程疑难解析与知识点汇总
    本文详细解答了 PHP 编程中的常见问题,并提供了丰富的代码示例和解决方案,帮助开发者更好地理解和应用 PHP 知识。 ... [详细]
  • 本文介绍了如何通过 Maven 依赖引入 SQLiteJDBC 和 HikariCP 包,从而在 Java 应用中高效地连接和操作 SQLite 数据库。文章提供了详细的代码示例,并解释了每个步骤的实现细节。 ... [详细]
  • MySQL缓存机制深度解析
    本文详细探讨了MySQL的缓存机制,包括主从复制、读写分离以及缓存同步策略等内容。通过理解这些概念和技术,读者可以更好地优化数据库性能。 ... [详细]
  • MySQL 数据库迁移指南:从本地到远程及磁盘间迁移
    本文详细介绍了如何在不同场景下进行 MySQL 数据库的迁移,包括从一个硬盘迁移到另一个硬盘、从一台计算机迁移到另一台计算机,以及解决迁移过程中可能遇到的问题。 ... [详细]
  • Hadoop入门与核心组件详解
    本文详细介绍了Hadoop的基础知识及其核心组件,包括HDFS、MapReduce和YARN。通过本文,读者可以全面了解Hadoop的生态系统及应用场景。 ... [详细]
  • 解决Element UI中Select组件创建条目为空时报错的问题
    本文介绍如何在Element UI的Select组件中使用allow-create属性创建新条目,并处理创建条目为空时出现的错误。我们将详细说明filterable属性的必要性,以及default-first-option属性的作用。 ... [详细]
  • 本文由瀚高PG实验室撰写,详细介绍了如何在PostgreSQL中创建、管理和删除模式。文章涵盖了创建模式的基本命令、public模式的特性、权限设置以及通过角色对象简化操作的方法。 ... [详细]
  • 本文详细介绍了MySQL InnoDB存储引擎中的间隙锁概念及其作用,探讨了它在解决幻读问题方面的关键角色,并解析了间隙锁与其他操作之间的冲突关系。同时,文章还讨论了next-key-lock的构成及应用,以及在不同场景下的优化策略。 ... [详细]
  • 在维护公司项目时,发现按下手机的某个物理按键后会激活相应的服务,并在屏幕上模拟点击特定坐标点。本文详细介绍了如何使用ADB Shell Input命令来模拟各种输入事件,包括滑动、按键和点击等。 ... [详细]
  • openGauss每日一练:第6天 - 模式的创建、修改与删除
    本篇笔记记录了openGauss数据库中关于模式(Schema)的创建、修改和删除操作。通过这些操作,用户可以更好地管理和控制数据库对象。实验环境为openGauss 2.0.0,并使用由墨天轮提供的线上环境。 ... [详细]
author-avatar
Hancl
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有