复制代码

为懒人提供无限可能,生命不息,code不止

人类感性的情绪,让我们知难行难
我思故我在
日拱一卒,功不唐捐
  • 首页
  • 前端
  • 后台
  • 数据库
  • 运维
  • 资源下载
  • 实用工具
  • 接口文档工具
  • 登录
  • 注册

mysql

【原创】mysql冗余索引优化

作者: whooyun发表于: 2025-02-22 11:39


idx_two_code is a left-prefix of idx_two_code_level
Key definitions:
KEY idx_two_code (two_code) USING BTREE,
KEY idx_two_code_level (two_code,level) USING BTREE,
Column types:
two_code varchar(30) character set utf8mb4 collate utf8mb4_0900_ai_ci default null comment '二字码'
level int not null default '0' comment '等级,0: 国家,1:省份,2:城市'
To remove this duplicate index, execute:
ALTER TABLE test.ex_area DROP INDEX idx_two_code;


## 直接从索引就能获得想要的数据,我们就可以称这个索引是覆盖索引, 覆盖索引直接从索引中就能获取数据,不需要回表,减少了磁盘io次数

  • 清除冗余索引(如 idx_two_code)的原因主要有几个方面,主要与索引的使用效率和维护成本有关。
idx_two_code 被认为是 idx_two_code_level 的左前缀,因此可以被视为冗余索引,因为它提供的覆盖性不如 idx_two_code_level。移除冗余索引可以提高数据库性能并减少维护成本。
  • 索引的使用效率
idx_two_code 索引:这是一个单列索引,只包含 two_code 列。
idx_two_code_level 索引:这是一个包含 two_code 和 level 两列的复合索引。
在大多数情况下,复合索引(如 idx_two_code_level)的使用效率更高,因为它们可以同时利用多个列进行筛选和排序。而单列索引(如 idx_two_code)虽然可以用于部分查询,但在很多情况下不如复合索引高效。


  • 维护成本:
多余的索引会增加数据库的维护成本,包括插入、更新和删除操作时的维护负担。
磁盘空间也会被占用,因为每个索引都需要存储空间。