同一列上的多个索引

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 操作,那么它们都会变慢。

创建索引所需的时间只能在实践中确定。有时甚至无法预测。

【讨论】:

以上是关于同一列上的多个索引的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server - 同一列上的多个 PIVOT

具有别名的同一列上的多个连接

在同一列上使用多个 WHERE 条件进行选择

同一列上具有多个外键的实体框架核心

SQL 内连接到同一个表,在多个列上,多次

在 DataGridView 的同一列上添加多个数据源