我有一个表,它已经有一个列与BTREE索引。现在我想为同一列添加一个唯一的键约束,以避免我的rails应用程序中的竞争条件。
所有参考博客/文章都显示,我必须添加一个迁移,以便在该列上创建一个新的uniq
索引,如下所示
add_index :products, :key, :string, unique: true
I want to understand
- 已经存在的BTREE索引会发生什么?(我需要这个)
- 是可以有两个索引,他们都工作良好吗?
- 表有大约30MN个条目,它会在添加索引时锁定表并花费大量时间添加这个UNIQUE索引吗?
你不需要两个索引。
在MySQL的默认存储引擎InnoDB中,UNIQUE KEY索引也是一个BTREE。InnoDB只支持BTREE索引,不管它们是否唯一(它也支持全文索引,但那是另一回事)。
所以唯一索引对于搜索和排序也很有用,就像非唯一索引一样。
创建索引将锁定表。我建议使用在线模式更改工具,如pt-online-schema-change或gh- cost。我们在我的公司使用前者,我们每周在生产表上运行数百个模式更改,而不会阻塞访问。事实上,使用这些工具中的一个可能会导致更改花费更长的时间,但我们不在乎,因为在运行时我们不会受到任何访问限制。
已经存在的BTREE索引会发生什么?(我需要这个)
。创建新索引不影响已有的索引。
是否可以同时拥有索引和它们都工作良好?
同一个表达式的两个索引只有唯一性不同?这没有意义。
建议在创建唯一索引时删除常规索引。这将节省大量的磁盘空间。另外,当使用相同表达式的正则索引和唯一索引存在时,服务器将永远不会使用正则索引。
表有大约30MN个条目,在添加索引时是否会锁定表并花费大量时间来添加这个UNIQUE索引?
表将在索引创建过程开始时被锁定。但是,如果同时执行索引创建和并行CUD操作,则两者都将变慢。
创建索引所需的时间只能在实践中确定。有时甚至无法预测。