【问题标题】:Order of multi column index in rails polymorphic associationrails多态关联中多列索引的顺序
【发布时间】:2017-02-13 20:38:01
【问题描述】:

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

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

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

【问题讨论】:

    标签: ruby-on-rails ruby activerecord polymorphic-associations


    【解决方案1】:

    这是 Derek Prior 在 Rails 中的 commit,它在为多态关联生成索引时更新了 add_reference 以在 id 之前使用 type。更改的理由转载如下:

    在多列索引中优先使用类型列

    add_reference 在你使用的时候可以非常有帮助地添加一个多列索引 它添加一个多态引用。但是,在第一列 index 是id 列,不太理想。

    [PostgreSQL 文档][1] 说:

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

    [MySQL 文档][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

    我认为在大多数情况下,这个顺序是有意义的。它允许您拥有一个在查询上表现良好的单一索引,包括 typeid 或只是 type

    话虽如此,您的用例可能会因您使用的数据库、数据集以及您计划运行的查询而异。最好的办法是在生产转储中分析您最常见的用例,并相应地选择您的索引策略。

    【讨论】:

    • 我不清楚如何将此与 Percona 的文章“Choosing Column Order in Indexes”中给出的建议相协调,即优先考虑最选择性列(那些将最大程度地减少匹配的数量)——从技术角度来说,具有最高 cardinality 的列。由于thing_type 的基数非常低(绝对和相对thing_id),那么如果我们只按类型查询,那么索引就没有用了,AFAICT。更好地优化两者的查询。
    【解决方案2】:

    来自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

    它只是从typeid 之前的数组映射。不知道为什么要这样设计,但最好只使用add_index

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-03-26
      • 1970-01-01
      • 1970-01-01
      • 2010-12-22
      • 2011-05-14
      • 1970-01-01
      • 2011-06-14
      相关资源
      最近更新 更多