唯一索引和标准索引是分开做的吗?

Is unique index and standard index be done separately?

我有这个关联 table 迁移:

create_table :association_table do |t|
  t.belongs_to :table1, index: true, foreign_key: true
  t.belongs_to :table2, index: true, foreign_key: true
  t.datetime :deleted_at, index: true

  t.timestamps
end

add_index :association_table, [:table1_id, :table2_id], unique: true

这为这个特定的 table 创建了五个索引。既然我已经为[:table1_id, :table2_id]的串联列建立了唯一索引,是否还需要在这2个字段上添加单独的索引index: true以加快查询速度?或者唯一索引可以完成这项工作吗?

在 table 中的特定列上创建索引,它可以帮助您加快查询结果与该列的条件。 示例:单列索引:

AssociationTable.where(:table1_id => 12)

在上面的查询中单列(table1_id)索引用于快速获取结果。

在 table 中的多个列上创建索引可以帮助您快速获取结果(如果您想按这些列进行过滤)。

示例:多列索引:

AssociationTable.where(:table1_id => 12, :table2_id => 17)

在上面的查询中多列(table1_id,table2_id)索引用于快速获取结果。

如果要查看查询分析和索引。每个数据库客户端都提供了工具,例如 Mysql- Workbench 查询分析器和 Postgres - PgAdmin 查询分析器。与那些人核实以获得实践知识。

设置uniq:true指的是一个索引,其中索引的所有行都必须是唯一的。也就是说,对于此索引中的所有列,同一行可能与另一行不具有相同的非 NULL 值。除了用于加速查询外,UNIQUE 索引还可用于对数据实施约束,因为数据库系统不允许在插入或更新数据时打破这种不同的值规则。

您的数据库系统可能允许将 UNIQUE 索引应用于允许 NULL 值的列,在这种情况下,如果两行都包含 NULL 值,则允许它们相同(这里的基本原理是 NULL 被认为不是等于自身)。但是,根据您的应用程序,您可能会发现这是不可取的:如果您希望避免这种情况,您应该禁止相关列中的 NULL 值。

复合唯一索引创建为,

add_index :association_table, [:table1_id, :table2_id], unique: true

这将 运行 更快的查询,例如,

AssociationTable.where(table1_id: 34, table2_id: 54)

Note-1 复合索引中的列顺序很重要,因此 AssociationTable.where(table2_id: 54, table1_id: 34) 不会 运行 更快

Note-2 如果您还拥有两者的唯一索引,那么将 table_id1table_id2 放在单独的索引中是没有意义的列