我的编程空间,编程开发者的网络收藏夹
学习永远不晚

如何优化Explain索引

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

如何优化Explain索引

这篇文章主要介绍“如何优化Explain索引”,在日常操作中,相信很多人在如何优化Explain索引问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何优化Explain索引”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

如何优化Explain索引

本文内容预览:

1.  项目背景介绍

      1.1 涉及的表结构

      1.2 明确查询诉求

 2.  索引问题确认和调优

      2.1 问题发现

      2.2 问题验证

      2.3 索引优化

Part1项目背景介绍

看过上一篇文章的同学应该还记得在叙述索引原理和实际案例的时候,我们列举了一个阿里分布式事务中主事务表的例子。

巧了,前段时间因为业务需求,我们开发了一个长事务一致性引擎用来应对广告体系中的计费时数据上下游一致性问题,其中也涉及了一个类似这样的表。

然而,最近迭代进行代码走查时发现,索引用的有问题。

0.1涉及的表结构

如何优化Explain索引

如上图所示,数据库的字段和索引结构是这个样子。

  •  tx_id全局唯一递增字段为主键。

  •  status字段标识该条记录的当前状态,用来区分未执行成功的记录

  •  创建时间和更新字段,用来辅助异步恢复时按时间衰减序列捞取执行。

各字段具体的起作用方式,有兴趣可以浏览之前写的《分布式事务从入门到放弃(二)--详述DT引擎一致性原理及设计》一文。

0.2明确查询诉求

该表的作用是捞取那些没有进行到终态的记录,进行异常恢复。

  •  为了避开系统正在处理中的记录,因此,将时间限定在1分钟之前。

  •  为了尽量高效,将时间范围限定在前10分钟,更久的失败记录交给更低频的定时任务处理。

  •  为了实现异步处理失败后的时间衰减,所以使用modify,同时也是为了避免新产生的数据因为老数据处理有问题而导致积压。

如何优化Explain索引

诉求其实也比较简单:定时捞取·前1分钟·到·前10分钟·,且,状态属于某些状态的记录,即:

select * from activity_t   where   status in (1,2)   and gmt_modified>='2021-01-01 xx:xx:10'   and gmt_modified<'2021-01-01 xx:xx:01'  order by gmt_create;

Part2索引问题确认和调优

0.3问题发现 

-- 唯一索引和联合索引  PRIMARY KEY (`tx_id`),  KEY `idx_status_time` (`status`,`gmt_create`,`gmt_modified`)

当前表的索引有两种:唯一索引tx_id,联合索引status_ctime_mtime。

我们当然希望的是有此索引的存在让之前的查询语句效率变高,乍一看,好像查询条件,排序条件都被联合索引包含了,那实际上,上述的查询语句,配合当前索引,能达到想要的效果吗?

根据我们上一篇文章的索引知识,可以给出结论,这个索引会有用,但不会全起作用。因为在联合索引下,处于后面位置的索引字段起作用的前提,是前置位的字段值相同。

0.4问题验证

如何优化Explain索引

Explain工具上场。

key=idx_status_time。key标识的是本次查询实际使用的索引。所以,说明我们的联合索引是起了一定作用的。

key_len=4。key_len标识的使用到的索引字段的长度。对于mysql5.7,status是int型占4个,时间字段是datetime型占5个。而这里len=4,说明只使用了status一个索引字段。

type=range。range说明查询status时已经是一个范围查询。

rows=167。说明为了找到结果,遍历了167。

Extra='Using index condition; Using filesort'。很糟糕的是,排序语句触发了文件排序。

上述结果,可以知道之前的索引设置是不合适的,时间索引没有被使用,而且,在排序的时候,使用了额外文件排序。效率和性能相对而言被影响较大,是需要消除的。

另外理论上,有查询优化器的存在,发现status的区分度不高,可能直接使用了索引里的时间字段,而不使用status。

如何优化Explain索引

毕竟,这份数据里,只有两个值,且数量级相差也不太多。

那么,按照创建索引的字段需要有足够的区分度这个原则,status字段还有必要放在索引里么?

带着问题我们来一起实际看下。

0.5索引优化

那么,我们应该怎么去调整索引以达到高效查询呢。

调整索引字段顺序

首先,考虑调整的是gmt_modified和gmt_create的顺序。

因为,联合索引下,中间有漏掉索引字段时,后续字段将不起作用。

如何优化Explain索引

调整两个时间顺序后,再看索引使用情况:

如何优化Explain索引

我们看到了变化:

key_len=9。说明使用了gmt_modified索引字段。

rows=2。这个变化说明我们的调整是有效的,查询到数据只进行了2个遍历。相比之前的167要高效很多。

但是,filesort还存在。

status有必要建在索引里么

如何优化Explain索引

我们把status从索引里删除掉,再来看下explain的结果:

如何优化Explain索引

没有了status的索引参与,想要在where条件里过滤,要比之前更加耗性能。所以,status是必要的。

filesort怎么优化掉

排序字段没有使用索引,我们能给其单独创建一个索引么?

答案是不能。

因为sql查询只会使用一个索引,在查询条件使用了索引的情况下,排序就不会再使用索引了。可以实际看下:

如何优化Explain索引

所以,单独给排序字段创建索引是没有用的。怎么办呢?

考虑修改sql,让排序字段使用到索引。

首先我们需要知道,mysql在执行order by的时候,会先查看参与排序的字段在执行计划里是否使用了索引:如果使用了索引,则说明结果是排好序的,否则,进行排序操作。

修改sql如下:

select * from activity_t   where   status in (1,2)   and gmt_modified>='2021-01-01 xx:xx:10'   and gmt_modified<'2021-01-01 xx:xx:01'  order by status,gmt_modified,gmt_create;

将查询条件字段也加到排序字段中,

如何优化Explain索引

可以看到,此时的Extra中已经没有filesort了。

当然,排序这个点,可以再考虑下是否真的需要,如果每次处理的异常数据很少,其实,不进行排序也可以。那样就又可以省一些索引空间了。

到此,关于“如何优化Explain索引”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注亿速云网站,小编会继续努力为大家带来更多实用的文章!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

如何优化Explain索引

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

MySQL索引优化EXPLAIN

日常在CURD的过程中,都避免不了跟数据库打交道,大多数业务都离不开数据库表的设计和SQL的编写,那如何让你编写的SQL语句性能更优呢? 先来整体看下MySQL逻辑架构图: MySQL整体逻辑架构图可以分为Server和存储引擎层。 Server层: Ser
MySQL索引优化EXPLAIN
2015-10-24

MySQL索引优化Explain详解

在日常工作中,我们会有时会开慢查询去记录一些执行时间比较久的SQL语句,找出这些SQL语句并不意味着完事了,些时我们常常用到explain这个命令来查看一个这些SQL语句的执行计划,查看该SQL语句有没有使用上了索引,有没有做全表扫描,这都
2022-05-12

Explain详解与索引优化实践

为什么要用explain 使用EXPLAIN关键字可以模拟优化器执行SQL语句,从而知道MySQL是如何处理你的SQL语句的。分析你的查询语句或是结构的性能瓶颈 如何使用explain 下面是使用 explain 的例子: 在 select 语句之前增加 ex
Explain详解与索引优化实践
2014-11-15

Explain进行索引分析和优化

至于如何来进项慢查询的优化呢?阿粉讲在下个文章来科普一下,毕竟今天已经我们吧分析索引的方法讲给了大家,大家也需要消化一下,不是么?

MySQL性能优化,MySQL索引优化,order by优化,explain优化

今天我们来讲讲如何优化MySQL的性能,主要从索引方面优化。

MySQL如何基于Explain关键字优化索引功能

explain显示了MySQL如何使用索引来处理select语句以及连接表。可以帮助选择更好的索引和写出更优化的查询语句。简单讲,它的作用就是分析查询性能。explain关键字的使用方法很简单,就是把它放在select查询语句的前面。mys
2022-05-12

存储优化补充篇:Explain索引优化实操

本文从一条sql查询和数据索引的构建的走查,发现了索引失效问题,并按索引知识一步步排查验证,直到我们认为OK。

MySQL如何优化索引

1. MySQL如何使用索引 索引用于快速查找具有特定列值的行。如果没有索引,MySQL必须从第一行开始,然后遍历整个表以找到相关的行。表越大,花费越多。如果表中有相关列的索引,MySQL可以快速确定要在数据文件中间查找的位置,而不必查看
2022-05-27

一本彻底搞懂MySQL索引优化EXPLAIN百科全书

1、MySQL逻辑架构日常在CURD的过程中,都避免不了跟数据库打交道,大多数业务都离不开数据库表的设计和SQL的编写,那如何让你编写的SQL语句性能更优呢?先来整体看下MySQL逻辑架构图:MySQL整体逻辑架构图可以分为Server和存储引擎层。Serve
一本彻底搞懂MySQL索引优化EXPLAIN百科全书
2019-08-29

SQL索引(索引优化)

#1.最左前缀匹配原则,非常重要的原则, create index ix_name_email on s1(name,email,) - 最左前缀匹配:必须按照从左到右的顺序匹配 select * from s1 where name="egon"; #可以
SQL索引(索引优化)
2021-11-01

MySQL中的索引如何优化

这篇文章主要介绍了MySQL中的索引如何优化的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇MySQL中的索引如何优化文章都会有所收获,下面我们一起来看看吧。使用索引优化索引是数据库优化最常用也是最重要的手段之一
2023-03-01

MySQL索引优化

一、单表创建索引之前:type=ALL全表扫描,Extra里面的Using filesort(文件内部排序)根据where后面的条件创建:CREATE INDEX idx_article_ccv ON article(category_id,comments,
MySQL索引优化
2019-01-06

MySQL中如何创建和优化索引

在MySQL中,可以使用CREATE INDEX语句来创建索引。例如,要在名为table_name的表中创建一个名为index_name的索引,可以使用以下语法:CREATE INDEX index_nameON table_name
MySQL中如何创建和优化索引
2024-04-09

Mysql 索引该如何设计与优化

什么是索引? 数据库索引是一种数据结构,它以额外的写入和存储空间为代价来提高数据库表上数据检索操作的速度。通俗来说,索引类似于书的目录,根据其中记录的页码可以快速找到所需的内容。——维基百科 常见索引有哪些?普通索引:最基本的索引,没有任何
2022-05-28

编程热搜

目录