关于如何清理过多索引的思考

news2024/10/7 2:27:16

今天同事提了一个问题,还是值得思考的,某个作为数据分发的MySQL库,有时候需要在不同的环境中同步创建数据库,但受工具限制,只能做数据同步,索引这些对象则需要单独创建,该数据库的索引太多,导致生成过程非常地耗时,而且可能会漏掉几个索引,而实际上这些索引并不都是经常需要的,或者可能存在冗余的,因此想问问怎么能清理索引?

这个问题可能非常具有代表性,究其根源,是在设计开发侧,很多情况下,开发人员接到一个需求,开发对应的SQL语句,会根据其经验,选择不同的路径,进而产生不同的影响。

(1)如果是优化经验比较欠缺的同学,目标就是SQL能跑出需要的结果集,不需要管什么非功能的需求,索引?不需要。而往往测试环境数据量很少,性能问题不会成为主要矛盾,能顺利通过测试。出问题,也是上线后,或是业务量积累到一定程度的时候。

(2)如果是具有一定优化经验的同学,可能会根据SQL中用到的条件,创建索引,但是有可能根本就不管这张表之前都创建了什么索引,当前是否有必要再创建一个索引,只是针对正在开发的这条SQL语句,需要创建什么字段的索引,就创建了,可能的结果,就是单就这条SQL的性能测试很可能是通过的,但是一张表上,极端情况很可能索引比字段还多,每个SQL需求对应着一个索引。索引多了,影响的是索引字段增删改维护索引的成本(注意:这里说的是索引字段的增删改,例如update一个非索引字段,不会产生索引维护的操作,因此这是比较严谨的说法,但是insert/delete,通常都是会涉及到所有的字段进而影响所有的索引)。

针对这个问题,清理索引最直观的方式,就是关注一张表的索引是否存在冗余,例如存在索引(a)和(a,b),此时(a,b)索引是可以覆盖(a)索引的,因为复合索引的前导列可以单独用,因此可删除(a)索引。

还可以关注一些索引创建的合理性,例如存在索引(a,b,c)和(a,c),看着是针对不同条件的SQL,但是如果b字段重复值很多(例如存储的性别),区分度很差,(a,b,c)索引和(a,c)索引的性能上应该相差无几,此时可以删除(a,b,c)的索引,因为(a,c)已经可以起到数据的过滤作用,但这种判断就需要结合实际的场景、数据分布、使用频率,来综合考量。

此外,如果是Oracle数据库,可以利用v$object_usage,监控和了解索引的使用情况,以此作为判断索引是否可删除的条件,如果一段时间内,某个索引一直没有调用记录,是不是可以认为具备删除的可能?

SQL> desc v$object_usage;
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 INDEX_NAME                                NOT NULL VARCHAR2(128)
 TABLE_NAME                                NOT NULL VARCHAR2(128)
 MONITORING                                         VARCHAR2(3)
 USED                                               VARCHAR2(3)
 START_MONITORING                                   VARCHAR2(19)
 END_MONITORING                                     VARCHAR2(19)

如果是其它数据库没这种监控功能,可以通过历史执行记录的检索,查询使用索引条件的语句是否执行过,或者对应索引的执行计划是否出现过,间接得到判断的线索。

其实,很多时候,如果能将一些优化工作前置,投入产出比就会更加有价值,例如在设计开发阶段,人为创建索引前,看下表中已经创建的索引,考虑下是否可以复用或改造的,或者通过工具平台以及AIGC的支持,当创建新索引时,基于已有索引,提前做判重操作,并给出提示,都可以提前暴露问题,降低改造成本,提高系统可用性,这才是在当前这个环境下,设计人员、开发人员、数据库工程师应该具备的一种能力和思想。

如果您认为这篇文章有些帮助,还请不吝点下文章末尾的"点赞"和"在看",或者直接转发pyq,

a3920d0f0515beec3941633066948e21.png

近期更新的文章:

《MySQL日志 - Binary log二进制日志介绍》

《最近碰到的一些问题》

《同一主机上启动多台MySQL服务器操作场景》

《一个job问题引出的Oracle官方文档的差错》

《来自二阳人的一些感想》

近期的热文:

《推荐一篇Oracle RAC Cache Fusion的经典论文》

《"红警"游戏开源代码带给我们的震撼》

文章分类和索引:

《公众号1200篇文章分类和索引》

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/622268.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

在 Transformers 中使用约束波束搜索引导文本生成

引言 本文假设读者已经熟悉文本生成领域波束搜索相关的背景知识,具体可参见博文 如何生成文本: 通过 Transformers 用不同的解码方法生成文本。 与普通的波束搜索不同,约束 波束搜索允许我们控制所生成的文本。这很有用,因为有时我们确切地知…

学习笔记之MySQL索引

1、引言 索引是数据库用来提高性能最常用的工具,一般索引本身也很大,不可能全部存于内存中,因此所以往往以文件形式存于磁盘上。 左表是数据表,共两列七条数据。为了加快Col2的查找,可以维护一个右表所示的二叉查找树…

图论与算法(7)最短路径问题

1.最短路径问题 1.1 带权图的最短路径 最短路径问题是指在一个加权图中寻找两个顶点之间的最短路径,其中路径的长度由边的权重确定。 常见的最短路径算法包括: Dijkstra算法:适用于解决单源最短路径问题,即从一个固定的起点到图…

meethigher-阿里邮箱POP3/SMTP服务

最近发现一个问题,小伙伴给我发的邮件,收和回都不及时。于是我现在将所有的邮箱,通过POP3/SMTP协议整合到了一起。再配合小米手环,就能做到邮件无遗漏。 一、邮箱常用协议 邮箱中常用三类协议 POP3 Post Office Protocol versi…

chatgpt赋能python:Python就业学历要求

Python 就业学历要求 Python 是一门广泛应用于数据科学、人工智能、Web 开发和自动化等领域的编程语言,正在迅速成为行业内最受欢迎的语言之一。如果你想进入这些领域从事相关职业,那么 Python 编程技能将是你的一个优势。但是,Python 就业所…

基于SSM+JSP的毕业生就业信息管理系统设计与实现

博主介绍: 大家好,我是一名在Java圈混迹十余年的程序员,精通Java编程语言,同时也熟练掌握微信小程序、Python和Android等技术,能够为大家提供全方位的技术支持和交流。 我擅长在JavaWeb、SSH、SSM、SpringBoot等框架下…

软考A计划-系统架构师-官方考试指定教程-(3/15)

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例 👉关于作者 专注于Android/Unity和各种游戏开发技巧,以及各种资源分享&am…

记录--纯CSS实现一个简单又不失优雅的步骤条

这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 步骤条是一种用于引导用户按照特定流程完成任务的导航条,在各种分步表单交互场景中广泛应用。先来看一下几个主流前端 UI 框架中步骤条组件的样子: ElementPlus AntDesign Ope…

BCM和board的引脚的区别是什么?如何查看GPIO的BCM和board之间的关系

在树莓派(Raspberry Pi)上使用 GPIO(通用输入输出)时,引脚可以使用两种不同的编号方式:BCM(Broadcom SOC Channel)和board。 BCM 编号:BCM 编号是基于 Broadcom 芯片的引脚编号方式。它使用芯片上的引脚功能编号来标识 GPIO 引脚,这种编号方式是树莓派广泛使用的默认…

Spring事务简介及相关案例

目录 一、事务简介 二、准备数据库 三、创建maven项目,引入依赖和完成相关配置 1. pom.xml文件 2. 创建配置文件 四、编写Java代码 1. Account实体类 2. AccountDao接口 3. AccountService业务类 五、测试 1. 测试方法 2. 测试结果​编辑 往期专栏&…

判断数组中的每个元素是否为正无穷大或负无穷大 numpy.isinf()

【小白从小学Python、C、Java】 【计算机等级考试500强双证书】 【Python-数据分析】 判断数组中的每个元素 是否为正无穷大或负无穷大 numpy.isinf() [太阳]选择题 请问关于以下代码的最后输出的是? import numpy as np a np.array([-np.inf,0,np.inf]) print(&q…

chatgpt赋能python:Python实现文件复制到另一个文件夹下的方法

Python实现文件复制到另一个文件夹下的方法 如果你经常需要复制文件并将它们保存到不同的文件夹下,那么使用Python脚本来执行此任务是一个非常好的选择。Python提供了强大的文件操作功能,使得编写脚本来完成文件操作变得相对简单。在本篇文章中&#xf…

【网站 seo 排名优化】typecho Handsome 主题高排名权重优化方案

前言 前一篇优化文章主要是完成了对于 typecho 各个方面的美化与简单优化,如下: 构造你独一无二的博客美化:typecho joe主题优化日志 而现在博主采用的是 Handsome 主题,相比较 joe 主题,编辑、定制功能更为强大、方便…

华为OD机试真题 JavaScript 实现【合法IP】【牛客练习题】

一、题目描述 IPV4地址可以用一个32位无符号整数来表示,一般用点分方式来显示,点将IP地址分成4个部分,每个部分为8位,表示成一个无符号整数(因此正号不需要出现),如10.137.17.1,是我…

Python中函数的介绍

在Python中,函数的三个要素是:函数名参数返回值 函数名:函数名是函数的标识符,用于唯一标识函数。在定义函数时,需要给函数一个名字,以便后续调用和引用。函数名应遵循命名规则,例如以字母或下划…

HDSLB VPP 23.04 is formally released

1 摘要 近年来随着数字化技术的发展,数据中心以及边缘设备的网络带宽需求越来越高。作为部署在服务入口位置的4层负载均衡器,其性能要求也随之水涨船高。为了应对当前的市场需求,充分利用Intel的软硬件技术和优势,针对4层负载均衡…

一个奇葩的问题

大家好,这里是极客重生,最近遇到一个奇葩的网络问题,分享给大家,看完一定会觉得很奇葩。 问题现象 客户反馈有一个server端S, 两个client端C1, C2, S的iptables规则对C1, C2都是放通的,但是C2无法连接上S&a…

有奖征文 | 夙兴夜寐,铸梦网安

出品|MS08067实验室(www.ms08067.com) 本文作者:潜龙勿用 01 时光荏苒,流年岁月如白驹过隙,不停飞逝于眼前,在这车马星驰的人间,踏入网络安全领域已然三年有余。我也终于从一开始的不…

左移右移 2022年国赛 思维

思路: 简单的思维题,应该从后往前遍历操作。如果后面的对数i操作过,则前面对数i的操作都可以无视。可以通过栈这种数据结构实现后往前遍历。 AC代码: import java.io.*; import java.util.*; public class Main{public static …