热门标签 | 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%的数据。


推荐阅读
  • MySQL索引详解与优化
    本文深入探讨了MySQL中的索引机制,包括索引的基本概念、优势与劣势、分类及其实现原理,并详细介绍了索引的使用场景和优化技巧。通过具体示例,帮助读者更好地理解和应用索引以提升数据库性能。 ... [详细]
  • 作者:守望者1028链接:https:www.nowcoder.comdiscuss55353来源:牛客网面试高频题:校招过程中参考过牛客诸位大佬的面经,但是具体哪一块是参考谁的我 ... [详细]
  • 本文介绍了如何通过 Maven 依赖引入 SQLiteJDBC 和 HikariCP 包,从而在 Java 应用中高效地连接和操作 SQLite 数据库。文章提供了详细的代码示例,并解释了每个步骤的实现细节。 ... [详细]
  • 本实验主要探讨了二叉排序树(BST)的基本操作,包括创建、查找和删除节点。通过具体实例和代码实现,详细介绍了如何使用递归和非递归方法进行关键字查找,并展示了删除特定节点后的树结构变化。 ... [详细]
  • MySQL缓存机制深度解析
    本文详细探讨了MySQL的缓存机制,包括主从复制、读写分离以及缓存同步策略等内容。通过理解这些概念和技术,读者可以更好地优化数据库性能。 ... [详细]
  • MySQL 数据库迁移指南:从本地到远程及磁盘间迁移
    本文详细介绍了如何在不同场景下进行 MySQL 数据库的迁移,包括从一个硬盘迁移到另一个硬盘、从一台计算机迁移到另一台计算机,以及解决迁移过程中可能遇到的问题。 ... [详细]
  • Hadoop入门与核心组件详解
    本文详细介绍了Hadoop的基础知识及其核心组件,包括HDFS、MapReduce和YARN。通过本文,读者可以全面了解Hadoop的生态系统及应用场景。 ... [详细]
  • 本文由瀚高PG实验室撰写,详细介绍了如何在PostgreSQL中创建、管理和删除模式。文章涵盖了创建模式的基本命令、public模式的特性、权限设置以及通过角色对象简化操作的方法。 ... [详细]
  • 本文详细介绍了 MySQL 中 LAST_INSERT_ID() 函数的使用方法及其工作原理,包括如何获取最后一个插入记录的自增 ID、多行插入时的行为以及在不同客户端环境下的表现。 ... [详细]
  • 本文探讨了MariaDB在当前数据库市场中的地位和挑战,分析其可能面临的困境,并提出了对未来发展的几点看法。 ... [详细]
  • 毕业设计:基于机器学习与深度学习的垃圾邮件(短信)分类算法实现
    本文详细介绍了如何使用机器学习和深度学习技术对垃圾邮件和短信进行分类。内容涵盖从数据集介绍、预处理、特征提取到模型训练与评估的完整流程,并提供了具体的代码示例和实验结果。 ... [详细]
  • 本文探讨了在Oracle数据库中,动态SQL语句的执行及其对事务管理的影响,特别是关于回滚操作的有效性。重点讨论了一个具体场景:将预警短信从当前表迁移到历史表时遇到的字段长度不匹配问题及相应的异常处理。 ... [详细]
  • 高效解决应用崩溃问题!友盟新版错误分析工具全面升级
    友盟推出的最新版错误分析工具,专为移动开发者设计,提供强大的Crash收集与分析功能。该工具能够实时监控App运行状态,快速发现并修复错误,显著提升应用的稳定性和用户体验。 ... [详细]
  • 本文详细探讨了VxWorks操作系统中双向链表和环形缓冲区的实现原理及使用方法,通过具体示例代码加深理解。 ... [详细]
  • 本题探讨如何通过最大流算法解决农场排水系统的设计问题。题目要求计算从水源点到汇合点的最大水流速率,使用经典的EK(Edmonds-Karp)和Dinic算法进行求解。 ... [详细]
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社区 版权所有