Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails rails多态关联中多列索引的顺序_Ruby On Rails_Ruby_Activerecord_Polymorphic Associations - Fatal编程技术网

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
的查询中表现良好

话虽如此,根据您使用的数据库、数据集和计划运行的查询,您的用例可能会有所不同。您最好的选择是在生产转储上分析您最常见的用例,并相应地选择索引策略