rails多态关联中多列索引的顺序

use*_*636 1 ruby activerecord ruby-on-rails polymorphic-associations

我有一个表格,其中包含我通过以下迁移生成的多态参考:

def change                  
  add_reference :table_name, :thing, polymorphic: true, index: true
end
Run Code Online (Sandbox Code Playgroud)

当我运行迁移时,它生成以下内容:

add_index "workflow_engine_task_bases", ["thing_type", "thing_id"], name: "index_workflow_engine_task_bases_on_thing_type_and_thing_id", using: :btree
Run Code Online (Sandbox Code Playgroud)

为什么最左边的列是thing_type?对我而言,这似乎不是最理想的,因为它不太具体.

O-I*_*O-I 6

这是Derek Prior在Rails中的提交,即在为多态关联生成索引之前add_reference使用的更新.改变的理由如下:typeid

首先在多列索引中使用type列

add_reference当您使用多列索引添加多态索引时,可以非常有用地添加它.但是,索引中的第一列是id列,不太理想.

[PostgreSQL docs] [1]说:

多列B树索引可以与涉及索引列的任何子集的查询条件一起使用,但是当前导(最左侧)列存在约束时,索引最有效.

[MySQL docs] [2]说:

MySQL可以对测试索引中所有列的查询使用多列索引,或者只测试第一列,前两列,前三列等的查询.如果在索引定义中以正确的顺序指定列,则单个复合索引可以加速同一表上的多种查询.

在多态关系中,类型列更有可能作为索引中的第一列而不是id列.也就是说,我更有可能在没有id的情况下查询类型,而不是在没有类型的情况下查询id.

[1]:http://www.postgresql.org/docs/9.3/static/indexes-multicolumn.html

[2]:http://dev.mysql.com/doc/refman/5.0/en/multiple-column-indexes.html

我认为在大多数情况下,这个顺序是有道理的.它允许您拥有一个在查询上表现良好的索引,包括type和/ id或只是type.

话虽如此,您的用例可能会有所不同,具体取决于您使用的数据库,数据集以及您计划运行的查询.最好的办法是在生产转储中分析最常见的用例,并相应地选择索引策略.


小智 0

来自http://apidock.com/rails/v4.2.7/ActiveRecord/ConnectionAdapters/SchemaStatements/add_reference

在源代码中add_reference

add_index(table_name, polymorphic ? [type id].map{ |t| "#{ref_name}_#{t}" } : "#{ref_name}_id", index_options.is_a?(Hash) ? index_options : {}) if index_options

type它只是从之前的数组进行映射id。不知道为什么要这样设计,但直接使用可能会更好add_index

add_index(:table, [:thing_id, :thing_type])