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

Python如何识别 MySQL 中的冗余索引

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

北京

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

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

看不清楚,换张图片

免费获取短信验证码

Python如何识别 MySQL 中的冗余索引

前言

最近在搞标准化巡检平台,通过 MySQL 的元数据分析一些潜在的问题。冗余索引也是一个非常重要的巡检目,表中索引过多,会导致表空间占用较大,索引的数量与表的写入速度与索引数成线性关系(微秒级),如果发现有冗余索引,建议立即审核删除。

PS:之前见过一个客户的数据库上面竟然创建 300 多个索引!?当时的想法是 “他们在玩排列组合呢” 表写入非常慢,严重影响性能和表维护的复杂度。

脚本介绍

表结构

下方是演示的表结构:

CREATE TABLE `index_test03` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `name` varchar(20) NOT NULL,
  `create_time` varchar(20) NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `uqi_name` (`name`),
  KEY `idx_name` (`name`),
  KEY `idx_name_createtime`(name, create_time)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

MySQL 元数据

MySQL 可以通过 information_schema.STATISTICS 表查询索引信息:

SELECT * from information_schema.STATISTICS  where TABLE_SCHEMA = 'test02' and TABLE_NAME = 'index_test03';
TABLE_CATALOGTABLE_SCHEMATABLE_NAMENON_UNIQUEINDEX_SCHEMAINDEX_NAMESEQ_IN_INDEXCOLUMN_NAMECOLLATIONCARDINALITYSUB_PARTPACKEDNULLABLEINDEX_TYPECOMMENTINDEX_COMMENT
deftest02index_test030test02PRIMARY1idA0NULLNULL BTREE  
deftest02index_test030test02uqi_name1nameA0NULLNULL BTREE  
deftest02index_test031test02idx_name1nameA0NULLNULL BTREE  
deftest02index_test031test02idx_name_createtime1nameA0NULLNULL BTREE  
deftest02index_test031test02idx_name_createtime2create_timeA0NULLNULL BTREE  

脚本通过获得 STATISTICS 表中的索引信息来分析表中是否存在冗余索引,分析粒度为表级别。

DEMO 演示

需要使用 pandas 模块。

import pandas as pd

df_table_level = pd.read_excel('/Users/cooh/Desktop/STATISTICS.xlsx')

table_indexes = df_table_level['INDEX_NAME'].drop_duplicates().tolist()

_indexes = list()
for index_name in table_indexes:
    index_info = {'index_cols': df_table_level[df_table_level['INDEX_NAME'] == index_name]['COLUMN_NAME'].tolist(),
                  'non_unique': df_table_level[df_table_level['INDEX_NAME'] == index_name]['NON_UNIQUE'].tolist()[0],
                  'index_name': index_name
                  }
    _indexes.append(index_info)

content = ''
election_dict = {i['index_name']: 0 for i in _indexes}

while len(_indexes) > 0:
    choice_index_1 = _indexes.pop(0)

    for choice_index_2 in _indexes:
        # 对比两个索引字段的个数,使用字段小的进行迭代
        min_len = min([len(choice_index_1['index_cols']), len(choice_index_2['index_cols'])])

        # 获得相似字段的个数据
        similarity_col = 0
        for i in range(min_len):
            # print(i)
            if choice_index_1['index_cols'][i] == choice_index_2['index_cols'][i]:
                similarity_col += 1

        # 然后进行逻辑判断
        if similarity_col == 0:
            # print('毫无冗余')
            pass
        else:
            # 两个索引的字段包含内容都相同,说明两个索引完全相同,接下来就需要从中选择一个删除
            if len(choice_index_1['index_cols']) == similarity_col and len(
                    choice_index_2['index_cols']) == similarity_col:
                # 等于 0 表示有唯一约束
                if choice_index_1['non_unique'] == 1:
                    content += '索引 {0} 与索引 {1} 重复, '.format(choice_index_2['index_name'], choice_index_1['index_name'])
                    election_dict[choice_index_1['index_name']] += 1
                elif choice_index_2['non_unique'] == 1:
                    content += '索引 {0} 与索引 {1} 重复, '.format(choice_index_1['index_name'], choice_index_2['index_name'])
                    election_dict[choice_index_2['index_name']] += 1
                else:
                    content += '索引 {0} 与索引 {1} 重复, '.format(choice_index_2['index_name'], choice_index_1['index_name'])
                    election_dict[choice_index_1['index_name']] += 1

            elif len(choice_index_1['index_cols']) == similarity_col and choice_index_1['non_unique'] != 0:
                content += '索引 {0} 与索引 {1} 重复, '.format(choice_index_2['index_name'], choice_index_1['index_name'])
                election_dict[choice_index_1['index_name']] += 1

            elif len(choice_index_2['index_cols']) == similarity_col and choice_index_1['non_unique'] != 0:
                content += '索引 {0} 与索引 {1} 重复, '.format(choice_index_1['index_name'], choice_index_2['index_name'])
                election_dict[choice_index_2['index_name']] += 1

redundancy_indexes = list()
for _k_name, _vote in election_dict.items():
    if _vote > 0:
        redundancy_indexes.append(_k_name)

content += '建议删除索引:{0}'.format(', '.join(redundancy_indexes))

print(content)

输出结果:

索引 uqi_name 与索引 idx_name 重复, 索引 idx_name_createtime 与索引 idx_name 重复, 建议删除索引:idx_name

SQL 查询冗余索引

MySQL 5.7 是可以直接通过 sys 元数据库中的视图来查冗余索引的,但是云上 RDS 用户看不到 sys 库。所以才被迫写这个脚本,因为实例太多了,一个一个看不现实。如果你是自建的 MySQL,就不用费那么大劲了,直接使用下面 SQL 来统计。

select * from sys.schema_redundant_indexes;

后记

删除索引属于高危操作,删除前需要多次 check 后再删除。上面是一个 demo 可以包装成函数,使用 pandas 以表为粒度传入数据,就可以嵌入到程序中。有问题欢迎评论沟通。

到此这篇关于python 识别 MySQL 中的冗余索引的文章就介绍到这了,更多相关MySQL冗余索引内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

免责声明:

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

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

Python如何识别 MySQL 中的冗余索引

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

下载Word文档

猜你喜欢

MySQL中冗余和重复索引的区别说明

MySQL允许在单个列上创建多个索引,无论是有意还是无意,MySQL需要单独维护这些重复索引,优化器在优化查询时也需要逐个考虑这会影响MySQL的性能 概念阐述 重复索引: 在相同的列上按照相同的顺序创建的相同类型的索引。应该避免创建这样的
2022-05-23

索引在Oracle中如何避免数据冗余

在Oracle数据库中,可以通过以下方式来避免数据冗余:正规化数据库设计:通过将数据分解成更小的表,并通过外键关联来消除数据冗余。使用唯一性约束:在表中添加唯一性约束,确保每个值都是唯一的,避免重复数据。使用索引:创建适当的索引可以提高查询
索引在Oracle中如何避免数据冗余
2024-08-16

MySQL中的索引如何优化

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

互联网中搜索引擎如何识别链接作弊的示例分析

这篇文章主要为大家展示了“互联网中搜索引擎如何识别链接作弊的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“互联网中搜索引擎如何识别链接作弊的示例分析”这篇文章吧。  首先,在谈论识别链接
2023-06-10

如何实现MySQL中创建索引的语句?

MySQL索引是提高数据检索速度的重要手段之一,它通过将数据存储在特定的数据结构中,加快了查询语句的执行速度。在MySQL中创建索引的语句非常简单,只需要在创建表的时候在相关字段后加上索引关键字即可。本文将为读者详细介绍如何在MySQL中创
如何实现MySQL中创建索引的语句?
2023-11-08

MySQL的索引在Python中如何合理创建和使用?(Python环境下如何为MySQL数据库合理创建和使用索引?)

在Python中为MySQL表创建和使用索引可以提高查询性能。使用create_index()方法创建索引,并使用filter()方法强制查询使用特定索引。最佳实践包括在经常用于where子句的列上创建索引,避免在经常更新的列上创建索引,并定期分析索引使用情况。Python提供内置函数get_indexes()、drop_index()和has_index()来管理索引。
MySQL的索引在Python中如何合理创建和使用?(Python环境下如何为MySQL数据库合理创建和使用索引?)
2024-04-02

如何实现MySQL中删除索引的语句?

如何实现MySQL中删除索引的语句?在MySQL中,索引是提高查询性能的重要工具之一。然而,有时候我们需要删除某个表的索引,可能是因为索引不再使用或者需要重新设计。本文将介绍如何在MySQL中删除索引的语句,并给出具体的代码示例。在MySQ
如何实现MySQL中删除索引的语句?
2023-11-08

Xunsearch搜索在图片识别与搜索中的应用(图片识别系统如何结合Xunsearch实现高效搜索?)

Xunsearch搜索引擎可整合图片识别系统,实现高效图片搜索。图片识别系统提取图片特征和内容,Xunsearch将其存储并提供基于文本和内容的搜索。这种结合提高了搜索精度,支持多样化的搜索方式,并优化了用户体验,在电商、社交媒体和医疗等领域具有广泛应用。
Xunsearch搜索在图片识别与搜索中的应用(图片识别系统如何结合Xunsearch实现高效搜索?)
2024-04-02

如何利用Python识别图片中的文字

这篇文章将为大家详细讲解有关如何利用Python识别图片中的文字,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一、Tesseract文字识别是ORC的一部分内容,ORC的意思是光学字符识别,通俗讲就是文字
2023-06-15

如何使用Python中的列表切片和索引

如何使用Python中的列表切片和索引列表是Python中常用的数据结构之一,可以存储多个元素。在实际开发中,经常需要对列表进行操作,其中列表切片和索引是非常常用的功能。本文将介绍如何使用Python中的列表切片和索引,并提供具体的代码示例
2023-10-22

python 如何在list中找Topk的数值和索引

需求: 对于一个python list 或者numpy数组,我需要找到这个list中最大的K个数及其对应的下标。 解决方式: 1. 可以构造字典通过排序解决,不过代码量较多。 2. 使用heapq库,可以直接获取最大值的下标和数值。impo
2022-06-02

编程热搜

目录