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


推荐阅读
  • Maven + Spring + MyBatis + MySQL 环境搭建与实例解析
    本文详细介绍如何使用MySQL数据库进行环境搭建,包括创建数据库表并插入示例数据。随后,逐步指导如何配置Maven项目,整合Spring框架与MyBatis,实现高效的数据访问。 ... [详细]
  • binlog2sql,你该知道的数据恢复工具
    binlog2sql,你该知道的数据恢复工具 ... [详细]
  • 本文介绍了MySQL窗口函数的基本概念、应用场景及常见函数的使用方法。窗口函数在处理复杂查询时非常有用,例如计算每个用户的订单排名、环比增长率、以及动态聚合等。 ... [详细]
  • 本文回顾了作者在求职阿里和腾讯实习生过程中,从最初的迷茫到最后成功获得Offer的心路历程。文中不仅分享了个人的面试经历,还提供了宝贵的面试准备建议和技巧。 ... [详细]
  • 解决ADODB连接Access时出现80004005错误的方法
    本文详细介绍了如何解决在使用ADODB连接Access数据库时遇到的80004005错误,包括错误原因分析和具体的解决步骤。 ... [详细]
  • 本文详细解析了MySQL中常见的几种错误,并提供了具体的解决方法,帮助开发者快速定位和解决问题。 ... [详细]
  • 本文探讨了如何在PHP与MySQL环境中实现高效的分页查询,包括基本的分页实现、性能优化技巧以及高级的分页策略。 ... [详细]
  • 本文详细介绍了Oracle 11g中的创建表空间的方法,以及如何设置客户端和服务端的基本配置,包括用户管理、环境变量配置等。 ... [详细]
  • 软件测试行业深度解析:迈向高薪的必经之路
    本文深入探讨了软件测试行业的发展现状及未来趋势,旨在帮助有志于在该领域取得高薪的技术人员明确职业方向和发展路径。 ... [详细]
  • 本文探讨了MySQL中的死锁现象及其监控方法,并介绍了如何通过配置和SQL语句调整来优化数据库性能。同时,还讲解了慢查询日志的配置与分析技巧。 ... [详细]
  • MVC模式下的电子取证技术初探
    本文探讨了在MVC(模型-视图-控制器)架构下进行电子取证的技术方法,通过实际案例分析,提供了详细的取证步骤和技术要点。 ... [详细]
  • 本文详细介绍如何在SSM(Spring + Spring MVC + MyBatis)框架中实现分页功能。包括分页的基本概念、数据准备、前端分页栏的设计与实现、后端分页逻辑的编写以及最终的测试步骤。 ... [详细]
  • Python3爬虫入门:pyspider的基本使用[python爬虫入门]
    Python学习网有大量免费的Python入门教程,欢迎大家来学习。本文主要通过爬取去哪儿网的旅游攻略来给大家介绍pyspid ... [详细]
  • 七大策略降低云上MySQL成本
    在全球经济放缓和通胀压力下,降低云环境中MySQL数据库的运行成本成为企业关注的重点。本文提供了一系列实用技巧,旨在帮助企业有效控制成本,同时保持高效运作。 ... [详细]
  • 本文介绍了如何通过安装 sqlacodegen 和 pymysql 来根据现有的 MySQL 数据库自动生成 ORM 的模型文件(model.py)。此方法适用于需要快速搭建项目模型层的情况。 ... [详细]
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社区 版权所有