独特的指数和标准指数是分开进行的吗?

问题描述 投票:0回答:2

我有这个关联表迁移:

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

这为此特定表创建了五个索引。鉴于我已经为[:table1_id, :table2_id]的串联列创建了唯一索引,是否仍然需要在这两个字段上添加单独的索引index: true,目的是加快查询速度?或者这个独特的指数会做那个工作吗?

ruby-on-rails postgresql database-design database-indexes
2个回答
1
投票

设置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)

注意1复合索引中的列顺序很重要因此AssociationTable.where(table2_id: 54, table1_id: 34)运行速度不快

注意2如果你还有两列的唯一索引,那么将table_id1table_id2放在单独的索引中是没有意义的


1
投票

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

AssociationTable.where(:table1_id => 12)

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

如果要按这些列进行过滤,则可以在表中的多个列上创建索引,这有助于您快速获取结果。

示例:多列索引:

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

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

如果要查看查询分析和索引。每个数据库客户端都可以使用工具,如Mysql-Workbench查询分析器和Postgres - PgAdmin查询分析器。检查那些获得实践知识的人。

© www.soinside.com 2019 - 2024. All rights reserved.