索引的一个小知识点:冗余索引和重复索引

举报
阿柠 发表于 2022/10/10 10:56:54 2022/10/10
【摘要】 冗余和重复索引MySQL是允许在相同列上创建多个索引,无论你创建的时候是有意的还是无意的。MySQL需要单独维护重复的索引,并且优化器在优化查询的时候也需要进行逐个考虑,这回影响性能。重复索引,啥叫重复索引,就是指在相同的列上按照相同的顺序创建的相同类型的索引。应该避免这样的创建,发现之后也应该立即移除。你比如说下面这样的例子:create table test( ID int NOT ...

冗余和重复索引

MySQL是允许在相同列上创建多个索引,无论你创建的时候是有意的还是无意的。MySQL需要单独维护重复的索引,并且优化器在优化查询的时候也需要进行逐个考虑,这回影响性能。

重复索引,啥叫重复索引,就是指在相同的列上按照相同的顺序创建的相同类型的索引。应该避免这样的创建,发现之后也应该立即移除。

你比如说下面这样的例子:

create table test(
		ID int NOT null primary key,
		......
		
		unique(ID),
		INDEX(ID)

这上面,你创建了一个主键,先加上唯一限制,然后再加上索引以供查询使用。事实上呀,MySQL的唯一限制和主键限制都是通过索引实现的 ,因此呀,上面这个写法其实就是在相同的列上 创建了三个重复的索引。通常情况下是没有必要这样做的,除非呀是在同一列上创建不同类型的索引来满足不同的查询需求。

冗余索引和重复索引其实又有一些不同。如果创建了索引(A,B),再创建索引(A)那就是冗余索引了,因为这只是前一个索引的前缀索引。但是你要是创建的是(B,A)那可就不是冗余索引了。当然不同的索引类型肯定也不会涉及到冗余索引的事情。

还有一种情况,将索引(A)扩展为了索引(A,ID),其中ID是主键,这在innodb中来说,主键列已经包含到二级索引中去了,所以这也是冗余索引。

大多数情况下,我们不应该是创建新索引,而是扩展已有的索引。但你话也不能说死,有时候出于性能的考虑,也会考虑冗余索引,因为你扩展索引会导致其变得太大,从而影响其他使用该索引的查询的性能。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。