Ruby on rails rails多态关联中多列索引的顺序
我有一个表,其中包含通过以下迁移生成的多态引用:Ruby on rails rails多态关联中多列索引的顺序,ruby-on-rails,ruby,activerecord,polymorphic-associations,Ruby On Rails,Ruby,Activerecord,Polymorphic Associations,我有一个表,其中包含通过以下迁移生成的多态引用: def change add_reference :table_name, :thing, polymorphic: true, index: true end 当我运行迁移时,它生成了以下内容: add_index "workflow_engine_task_bases", ["thing_type", "thing_id"], name: "index_workflow_engine_task_bas
def change
add_reference :table_name, :thing, polymorphic: true, index: true
end
当我运行迁移时,它生成了以下内容:
add_index "workflow_engine_task_bases", ["thing_type", "thing_id"], name: "index_workflow_engine_task_bases_on_thing_type_and_thing_id", using: :btree
为什么最左边的列是类型?在我看来,这似乎是次优的,因为它没有那么具体。来自
在的源代码中添加参考
:
add_index(table_name,多态?[type id].map{t|“{ref_name}}{t}:“{ref_name}}}id”,index_选项。如果index_选项
它只是从type
位于id
前面的数组进行映射。我不知道为什么它是这样设计的,但是使用add\u index
可能更好
add\u index(:table,[:thing\u id,:thing\u type])
这是Derek在Rails中编写的,在为多态关联生成索引时更新add\u reference
以使用type
之前的id
。变更的理由如下:
在多列索引中首先使用类型列
add_reference
在使用
它需要添加多态引用。但是,中的第一列
索引是id
列,它不太理想
[PostgreSQL docs][1]说:
多列B树索引可以与以下查询条件一起使用:
涉及索引列的任何子集,但索引是最重要的
在前导(最左侧)上存在约束时有效
列
[MySQL docs][2]说:
MySQL可以使用多个列索引进行查询,以测试所有
索引中的列,或仅测试第一列的查询
前两列、前三列,依此类推。如果您指定
索引定义中按正确顺序排列的列,单个
复合索引可以加速同一个数据库上的多种查询
桌子
在多态关系中,类型列更可能是
用作索引中的第一列而不是id列。就是说,我
查询没有id的类型比查询id更有可能
没有类型
[1] :
[2] :
我认为在大多数情况下,这个顺序是合理的。它允许您拥有一个索引,该索引在包括type
和id
或只是type
的查询中表现良好
话虽如此,根据您使用的数据库、数据集和计划运行的查询,您的用例可能会有所不同。您最好的选择是在生产转储上分析您最常见的用例,并相应地选择索引策略