唯一索引和标准索引是否分别进行?

时间:2019-02-28 06:43:25

标签: ruby-on-rails postgresql database-design database-indexes

我有此关联表迁移:

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?还是唯一索引可以完成这项工作?

2 个答案:

答案 0 :(得分:1)

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

AssociationTable.where(:table1_id => 12)

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

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

示例:多列索引:

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

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

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

答案 1 :(得分: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放在单独的索引中是没有意义的