返回顶部
首页 > 资讯 > 数据库 >如何优化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://lsjlt.com/news/61539.html(转载时请注明来源链接)

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

猜你喜欢
  • 如何优化Explain索引
    这篇文章主要介绍“如何优化Explain索引”,在日常操作中,相信很多人在如何优化Explain索引问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何优化Explain索引”...
    99+
    2024-04-02
  • 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如何优化索引
    1.  MySQL如何使用索引 索引用于快速查找具有特定列值的行。如果没有索引,MySQL必须从第一行开始,然后遍历整个表以找到相关的行。表越大,花费越多。如果表中有相关列的索引,MySQL可以快速确定要在...
    99+
    2022-05-27
    MySQL 索引 MySQL 优化索引
  • Mysql索引如何优化
    小编给大家分享一下Mysql索引如何优化,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!编程沉思录     &...
    99+
    2024-04-02
  • MySQL中如何优化索引
    MySQL中如何优化索引,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。文章的脑图如下:索引优化规则1、like语句的前导模糊查询不能使用索...
    99+
    2024-04-02
  • SQL索引(索引优化)
    #1.最左前缀匹配原则,非常重要的原则, create index ix_name_email on s1(name,email,) - 最左前缀匹配:必须按照从左到右的顺序匹配 select * from s1 wher ...
    99+
    2021-11-01
    SQL索引(索引优化)
  • MySQL索引如何进行优化
    这篇文章主要介绍了MySQL索引如何进行优化,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。  创建 test 测试表  CREATE TAB...
    99+
    2024-04-02
  • MySQL中的索引如何优化
    这篇文章主要介绍了MySQL中的索引如何优化的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇MySQL中的索引如何优化文章都会有所收获,下面我们一起来看看吧。使用索引优化索引是数...
    99+
    2023-03-01
    mysql
  • 一本彻底搞懂MySQL索引优化EXPLAIN百科全书
    1、MySQL逻辑架构 日常在CURD的过程中,都避免不了跟数据库打交道,大多数业务都离不开数据库表的设计和SQL的编写,那如何让你编写的SQL语句性能更优呢? 先来整体看下MySQL逻辑架构图: MySQL整体逻辑架构图可以分...
    99+
    2019-08-29
    一本彻底搞懂MySQL索引优化EXPLAIN百科全书
  • SQL优化之如何使用索引
    这篇文章主要介绍SQL优化之如何使用索引,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!下面 sql  30秒执行出结果,查看 sql ...
    99+
    2024-04-02
  • mysql中索引配置如何优化
    这篇文章将为大家详细讲解有关mysql中索引配置如何优化,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。 2     索引及查询优...
    99+
    2024-04-02
  • MySQL索引优化
    一、单表 创建索引之前:type=ALL全表扫描,Extra里面的Using filesort(文件内部排序) 根据where后面的条件创建:CREATE INDEX idx_article_ccv ON articl...
    99+
    2019-01-06
    MySQL索引优化
  • oracle 优化--索引
    一、事务1、简介事务是数据处理的核心,是业务上的一个逻辑单元,它能够保证其中对数据所有的操作,要么全部成功,要么全部失败。DBMS通过事务的管理来协调用户的并发行为,减少用户访问资源的冲突。 1)...
    99+
    2024-04-02
  • mysql织梦索引优化之MySQL Order By索引优化
    在一些情况下,MySQL可以直接使用索引来满足一个ORDER BY 或GROUP BY 子句而无需做额外的排序。尽管ORDER BY 不是和索引的顺序准确匹配,索引还是可以被用到,只要不用的索引部分和所有的额外的ORDER B...
    99+
    2024-04-02
  • Mysql 索引该如何设计与优化
    什么是索引? 数据库索引是一种数据结构,它以额外的写入和存储空间为代价来提高数据库表上数据检索操作的速度。通俗来说,索引类似于书的目录,根据其中记录的页码可以快速找到所需的内容。——维基百科 常见索引有哪些? ...
    99+
    2022-05-28
    MySQL 索引设计 MySQL 索引优化
  • MySQL中如何创建和优化索引
    在MySQL中,可以使用CREATE INDEX语句来创建索引。例如,要在名为table_name的表中创建一个名为index_na...
    99+
    2024-04-09
    MySQL
  • MySQL优化(3):索引
    MySQL优化中,最重要的优化手段就是索引,也是最常用的优化手段   索引简介: 索引:关键字与数据位置之间的映射关系 关键字:从数据中提取,用于标识,检索数据的特定内容 目的:加快检索   索引检索为什么快: (1)关键字相对于...
    99+
    2014-05-17
    MySQL优化(3):索引
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作