同一列上的多个索引
Posted
技术标签:
【中文标题】同一列上的多个索引【英文标题】:Multiple index on same column 【发布时间】:2021-10-30 13:57:15 【问题描述】:我有一个表,其中已经有一个带有 BTREE 索引的列。现在我想在同一列中添加一个唯一键约束,以避免我的 rails 应用程序出现竞争条件。
所有参考博客/文章都显示我必须添加迁移才能在该列上创建新的uniq
索引,如下所示
add_index :products, :key, :string, unique: true
我想了解
已经存在的 BTREE 索引会发生什么?(我需要这个) 是否可以同时拥有索引并且它们都可以正常工作? 表有大约 3000 万个条目,是否会在添加索引时锁定表并花费大量时间来添加此唯一索引?【问题讨论】:
【参考方案1】:你不需要两个索引。
在 mysql 的默认存储引擎 InnoDB 中,一个 UNIQUE KEY 索引也是一个 BTREE。 InnoDB 仅支持 BTREE 索引,无论它们是否唯一(它也支持全文索引,但这是另一回事)。
所以唯一索引对于搜索和排序也很有用,就像非唯一索引一样。
建立索引会锁定表。我建议使用pt-online-schema-change 或gh-ost 之类的在线模式更改工具。我们在我的公司使用前者,我们每周在生产表上运行数百次模式更改,而不会阻止访问。事实上,使用其中一种工具可能会导致更改花费更长的时间,但我们不在乎,因为在它运行时我们不会受到任何受限访问。
【讨论】:
【参考方案2】:已经存在的 BTREE 索引会发生什么?(我需要这个)
什么都没有。创建新索引不会影响现有索引。
是否可以同时拥有索引并且它们都可以正常工作?
同一表达式的两个索引仅在唯一性上有所不同?这毫无意义。
建议在创建唯一索引时删除常规索引。这将节省大量磁盘空间。此外 - 当存在相同表达式(字面意思!)的常规索引和唯一索引时,服务器将永远不会使用常规索引。
表有大约 3000 万个条目,是否会在添加索引时锁定表并花费大量时间来添加此唯一索引?
该表将在索引创建过程开始时很快被锁定。但是如果执行索引创建和并行 CUD 操作,那么它们都会变慢。
创建索引所需的时间只能在实践中确定。有时甚至无法预测。
【讨论】:
以上是关于同一列上的多个索引的主要内容,如果未能解决你的问题,请参考以下文章