前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >MySQL高级--性能优化之Explain分析SQL

MySQL高级--性能优化之Explain分析SQL

原创
作者头像
Java学术趴
发布2022-11-16 13:49:19
8560
发布2022-11-16 13:49:19
举报
文章被收录于专栏:Java全栈·Java全栈·

👨‍🎓作者:Java学术趴 🏦仓库:GithubGitee ✏️博客:CSDN掘金InfoQ云+社区 💌公众号:Java学术趴 🚫特别声明:原创不易,未经授权不得转载或抄袭,如需转载可联系小编授权。 🙏版权声明:文章里的部分文字或者图片来自于互联网以及百度百科,如有侵权请尽快联系小编。

☠️每日毒鸡汤:一件事你犹豫去不去做,那就是该立即动身做的。

1 Explain查看执行计划

  • Explain + SQL : 查看执行计划包含的信息。(在正常的SQL语句之间加Explain查看执行计划信息)
3.5.1 执行计划包含的查询信息

不加\G横向显示

加\G纵向展示

1.2 表的读取顺序

id: select查询的序列号(是一组数字),表示查询中执行select子句或操作的顺序。分为三种情况

  • id相同,执行顺序由上至下。
  • id不同,如果是子查询,id的序号会递增,id值越大优先级越高,越先被执行。
  • id相同不同,同时存在。
1.3 数据读取操作的操作类型

select_type : 查询的类型。主要用于区别普通查询、联合查询、子查询等的复杂查询。

  • SIMPLE :简单的select查询,查询中不包含子查询或者UNION。
  • PRIMARY : 查询中若包含任何复杂的子查询部分,这个类型代表最外层的。
  • SUBQUERY: 在SELECT或WHERE列表中包含了子查询。
  • DERIVED: 在FROM列表中包含的子查询被标记为DERIVED(衍生),MySQL会递归执行这些子查询,把结果放在临时表里。
  • UNION: 若第二个SELECT出现在UNION之后,则被标记为UNION。若UNION包含在FROM子句的子查询中,外层SELECT将被标记为:DERIVED。
  • UNION RESULT: 从UNION表获取结果的SELECT。
1.4 当前数据表名

table: 查询当前这一行数据是关于哪个表的。

1.5 访问类型排序

type: 显示查询使用的是何种类型。

从最好到最差一次是:system>const>eq_ref>ref>range>index>ALL

一般来说,得保证查询至少达到range级别,最好能达到ref级别。

  • system: 表只有一行记录(等于系统表),这是const类型的特例,平时不会出现,这个也可以忽略不计。
  • const: 表通过索引一次就能找到了,const用于比较 primary keyunique 索引。因为只匹配一行数据,所以很快。如将主键置于where列表中,MySQL就能将该查询转换为一个常量。
  • eq_ref: 唯一性索引扫描,对于每个索引键,表中只有一条记录与之匹配。 常见于主键或唯一索引扫描。
  • ref: 非唯一性索引扫描,返回匹配某个单独值的所有行。 本质上也是一种索引访问,它返回所有匹配某个单独值的行,然而,它可能会找到多个符合条件的行,所以它应该数据查询和扫描的混合体。
  • range: 只检索给定范围的行,使用一个索来选择行。 key列显示使用了哪个索引。一般就是在你的where语句中出现了 between、<、>、in 等的查询。这种范围扫描索引比全表扫描要好,因为是从某一个节点开始,而结束于某一个节点,不用全局扫描。
  • index: Full Index Scan ,index和ALL区别为index类型只遍历所引树。这通常比ALL快,因为索引文件通常比数据文件小。(虽然 ALLindex都是全读,但是ALL是从磁盘上读取原始数据,而index是读取全部的索引。)
  • all: Full Table Scan ,将遍历源数据的全表以找到匹配的数据。
1.6 显示可能应用在这张表中的索引
  • possible_keys :查询涉及到的字段上若存在索引,则该索引将被列出,但不一定被查询实际使用。如果没有则为NULL。
1.7 实际用到的索引
  • key: 实际使用的索引,如果为NULL,则没有使用索引。查询中若使用了覆盖索引,则该索引仅出现在key列表中。

我们真正使用的是key中存在的索引。

1.8 索引长度
  • key_len : 显示索引中使用的字节数,可通过该列计算查询中使用的索引长度。在不损失精确性的情况下,长度越短越好。
  • key_len显示的值为索引字段的最大可能长度, 并非实际使用长度,即key_len是根据表定义计算而得,不是通过表内检索出来的。
1.9 索引对应的列
  • ref: 显示索引的哪一列被使用了,如果可能的话,是一个常数。哪些劣或常量被用于查找查找索引列上的值。
1.10 花费行数
  • rows: 根据表统计信息及索引选用情况,大概估算出找出所需记录需要读取的行数。
1.11 额外数据
  • Extra: 不适合在其他列显示但十分重要的额外信息。

额外属性

  • Using filesort: 说明MySQL会对数据使用一个外部的索引排序,而不是按照表内的索引顺序进行读取。MySQL中无法利用索引完成的排序操作称之为“文件排序”。

这里创建的是一个聚合索引(col1,col2,col3),第二个SQL没有提示使用文件内部排序是因为使用列按照了索引的顺序(col1->col2->col3),但是第一个SQL没有使用到col2,产生了一个断层,此时就需要MySQL内部自己进行一次文件排序。在使用 OEDER BY 排序的时候一定要符合聚合索引的顺序。

  • Using temporary: 使用了临时表保存中间结果,MySQL在对查询结果排序时使用临时表。常见于排序ORDER BY 和 分组查询 GROUP BY

这里创建的是一个聚合索引(col1,col2),第二个SQL在 GROUP BY 的时候没有按照聚合索引的顺序,导致排序和分组都会提示相应的错误,一定要按照索引的顺序进行分组和排序。

  • Using index: 表示相应的select操作中使用了覆盖索引(Covering Index) ,避免访问了表的数据行,效果不错。如果同时出现了 using where,表示索引被用来执行索引键值的查找。如果没有同时出现 using where ,表示索引用来读取数据而非执行查找动作。

覆盖索引(Covering Index) : 就是 select 的查询的列从索引中就可以获取到,而不必去读取表中的原始数据,MySQL可以利用索引返回 select 列表中的字段,而不必根据索引再次读取数据文件,换句话说: 查询列要被索引覆盖。

代码语言:javascript
复制
// t1表中存在 index_col1_col2 聚合索引
select col1,clo2 from t1;
// 我们只查询 col1和col2,并且这两个字段的数据都可以从索引中获取,此时叫做索引覆盖
select col1 from t1;
// 查部分字段也是可以的
复制代码
  • Using where: 说明使用了where过滤。
  • Using join buffer: 说明使用了表连接缓存。
  • impossible where: where子句中的值总是false,不能用来获取任何元组。(就比如找一个人,给定的查询条件,性别既是男性又是女性)

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1 Explain查看执行计划
    • 3.5.1 执行计划包含的查询信息
      • 1.2 表的读取顺序
        • 1.3 数据读取操作的操作类型
          • 1.4 当前数据表名
            • 1.5 访问类型排序
              • 1.6 显示可能应用在这张表中的索引
                • 1.7 实际用到的索引
                  • 1.8 索引长度
                    • 1.9 索引对应的列
                      • 1.10 花费行数
                        • 1.11 额外数据
                        相关产品与服务
                        云数据库 SQL Server
                        腾讯云数据库 SQL Server (TencentDB for SQL Server)是业界最常用的商用数据库之一,对基于 Windows 架构的应用程序具有完美的支持。TencentDB for SQL Server 拥有微软正版授权,可持续为用户提供最新的功能,避免未授权使用软件的风险。具有即开即用、稳定可靠、安全运行、弹性扩缩等特点。
                        领券
                        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档