广告
返回顶部
首页 > 资讯 > 数据库 >如何优化Explain索引
  • 162
分享到

如何优化Explain索引

2024-04-02 19:04:59 162人浏览 安东尼
摘要

这篇文章主要介绍“如何优化Explain索引”,在日常操作中,相信很多人在如何优化Explain索引问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何优化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索引”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

您可能感兴趣的文档:

--结束END--

本文标题: 如何优化Explain索引

本文链接: https://www.lsjlt.com/news/61539.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

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

下载Word文档
猜你喜欢
  • 如何优化Explain索引
    这篇文章主要介绍“如何优化Explain索引”,在日常操作中,相信很多人在如何优化Explain索引问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何优化Explain索引”...
    99+
    2022-10-18
  • MySQL索引优化EXPLAIN
    日常在CURD的过程中,都避免不了跟数据库打交道,大多数业务都离不开数据库表的设计和SQL的编写,那如何让你编写的SQL语句性能更优呢? 先来整体看下MySQL逻辑架构图: MySQL整体逻辑架构图可以分为Server和存储引擎层。...
    99+
    2015-10-24
    MySQL索引优化EXPLAIN
  • MySQL索引优化Explain详解
    在日常工作中,我们会有时会开慢查询去记录一些执行时间比较久的SQL语句,找出这些SQL语句并不意味着完事了,些时我们常常用到explain这个命令来查看一个这些SQL语句的执行计划,查看该SQL语句有没有使用上了索引...
    99+
    2022-05-12
    MySQL索引优化 MySQL Explain
  • Explain详解与索引优化实践
    为什么要用explain 使用EXPLAIN关键字可以模拟优化器执行SQL语句,从而知道MySQL是如何处理你的SQL语句的。分析你的查询语句或是结构的性能瓶颈 如何使用explain 下面是使用 explain 的例子: 在 s...
    99+
    2014-11-15
    Explain详解与索引优化实践
  • MySQL如何基于Explain关键字优化索引功能
      explain显示了MySQL如何使用索引来处理select语句以及连接表。可以帮助选择更好的索引和写出更优化的查询语句。简单讲,它的作用就是分析查询性能。   explain关键字的使用方法很简单,就...
    99+
    2022-05-12
    MySQL Explain关键字 索引
  • 一本彻底搞懂MySQL索引优化EXPLAIN百科全书
    1、MySQL逻辑架构 日常在CURD的过程中,都避免不了跟数据库打交道,大多数业务都离不开数据库表的设计和SQL的编写,那如何让你编写的SQL语句性能更优呢? 先来整体看下MySQL逻辑架构图: MySQL整体逻辑架构图可以分...
    99+
    2019-08-29
    一本彻底搞懂MySQL索引优化EXPLAIN百科全书
  • SQL索引(索引优化)
    #1.最左前缀匹配原则,非常重要的原则, create index ix_name_email on s1(name,email,) - 最左前缀匹配:必须按照从左到右的顺序匹配 select * from s1 wher ...
    99+
    2021-11-01
    SQL索引(索引优化)
  • MySQL如何优化索引
    1.  MySQL如何使用索引 索引用于快速查找具有特定列值的行。如果没有索引,MySQL必须从第一行开始,然后遍历整个表以找到相关的行。表越大,花费越多。如果表中有相关列的索引,MySQL可以快速确定要在...
    99+
    2022-05-27
    MySQL 索引 MySQL 优化索引
  • Mysql索引如何优化
    小编给大家分享一下Mysql索引如何优化,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!编程沉思录     &...
    99+
    2022-10-18
  • MySQL中如何优化索引
    MySQL中如何优化索引,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。文章的脑图如下:索引优化规则1、like语句的前导模糊查询不能使用索...
    99+
    2022-10-18
  • MySQL索引优化
    一、单表 创建索引之前:type=ALL全表扫描,Extra里面的Using filesort(文件内部排序) 根据where后面的条件创建:CREATE INDEX idx_article_ccv ON articl...
    99+
    2019-01-06
    MySQL索引优化
  • oracle 优化--索引
    一、事务1、简介事务是数据处理的核心,是业务上的一个逻辑单元,它能够保证其中对数据所有的操作,要么全部成功,要么全部失败。DBMS通过事务的管理来协调用户的并发行为,减少用户访问资源的冲突。 1)...
    99+
    2022-10-18
  • mysql织梦索引优化之MySQL Order By索引优化
    在一些情况下,MySQL可以直接使用索引来满足一个ORDER BY 或GROUP BY 子句而无需做额外的排序。尽管ORDER BY 不是和索引的顺序准确匹配,索引还是可以被用到,只要不用的索引部分和所有的额外的ORDER B...
    99+
    2022-10-20
  • MySQL索引如何进行优化
    这篇文章主要介绍了MySQL索引如何进行优化,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。  创建 test 测试表  CREATE TAB...
    99+
    2022-10-19
  • MySQL中的索引如何优化
    这篇文章主要介绍了MySQL中的索引如何优化的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇MySQL中的索引如何优化文章都会有所收获,下面我们一起来看看吧。使用索引优化索引是数...
    99+
    2023-03-01
    mysql
  • MySQL优化(3):索引
    MySQL优化中,最重要的优化手段就是索引,也是最常用的优化手段   索引简介: 索引:关键字与数据位置之间的映射关系 关键字:从数据中提取,用于标识,检索数据的特定内容 目的:加快检索   索引检索为什么快: (1)关键字相对于...
    99+
    2014-05-17
    MySQL优化(3):索引
  • MySQL优化之索引
    SQL为什么需要优化? 对于初学者来说,能够写出实现功能的SQL语句而不出错,查询出所需要的结果,就已经能够满足日常使用了。但在某些场景,对性能的要求比较高,因此,要求SQL的执行响应速度快,就需要对SQL进行一定程度的优化。 在...
    99+
    2021-02-14
    MySQL优化之索引
  • MySQL 5.7 索引优化
    提升查询性能最好的方法就是创建索引。索引项就像指向表中行的指针,让查询通过WHERE条件快速找到所要查询的行。MySQL所有的数据类型都可以创建索引。 不必要的索引会消耗系统的空间和MySQL在判断...
    99+
    2022-10-18
  • centos7-mysql-索引优化
    索引优化,优化查询速度-------------------------------------------------------count,统计一个表总计行数myisam储存引擎有自带计数器,使用cou...
    99+
    2022-10-18
  • mysql优化和索引
    表的优化1.定长与变长分离    如 int,char(4),time核心且常用字段,建成定长,放在一张表;    而varchar,text,blob这种...
    99+
    2022-10-18
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作