【问题标题】:How to specify a multiple column index correctly in Rails如何在 Rails 中正确指定多列索引
【发布时间】:2012-10-29 05:03:07
【问题描述】:

如本题所示: How do I make a column unique and index it in a Ruby on Rails migration?
你可以写:

add_index :the_table, [:foo_column, :bar_column], unique: true

添加多列索引。
但是是否仍然需要为您已经指定多列索引的每一列添加单个索引?

我的意思是写下面的代码除了上面显示的代码。

add_index :the_table, :foo_column  
add_index :the_table, :bar_column

【问题讨论】:

    标签: mysql ruby-on-rails postgresql indexing


    【解决方案1】:

    对于 MySQL:

    MySQL 将能够使用索引 [:foo_column, :bar_column] 来查询两列的条件,也可以只查询左列的条件,而不是右列的条件。

    更多信息在这里:http://dev.mysql.com/doc/refman/5.0/en/multiple-column-indexes.html

    所以你应该这样做

    add_index :the_table, [:foo_column, :bar_column], :unique => true
    add_index :the_table, :bar_column
    

    为了确保您正确索引所有内容

    MySQL 从左到右对列进行索引,因此如果您有这样的多列索引:[:col1, :col2, :col3, :col4],您可以在以下位置查询该索引:

    • col1
    • col1 + col2
    • col1 + col2 + col3
    • col1 + col2 + col3 + col4

    因此您可以查询最左侧的列

    如果您需要其他任何内容,则必须创建更多索引

    同样,这仅适用于 MySQL,postgres 的工作方式可能不同

    【讨论】:

    • 哇,我真的没有想到这个答案。对我来说,这似乎是一个很奇怪的行为。由于文档说 MySQL 从左到右顺序检查列,这是否意味着您需要为除第一列之外的每一列添加索引(在多列索引中指定超过 2 列时)?
    • 啊……没关系。看起来它的行为就像我刚刚评论的那样。文档说“它也像 left-most 列的索引”。
    • 用更多信息编辑了我的答案,它是最左边的列
    • 我明白了!现在我明白“最左边的列”是什么意思了。英语很难。
    • 希望我有 8 只手,所以我可以给这个答案 8 个大拇指 ..thx
    【解决方案2】:

    对于 PostgreSQL:

    PostgreSQL: Documentation: Multicolumn Indexes 说:

    多列 B 树索引可以与 查询条件一起使用 涉及索引列的任何子集,但索引是最 当前导(最左边)有约束时有效 列。 确切的规则是领先的等式约束 列,加上第一列上的任何不等式约束 没有等式约束,将用于限制 被扫描的索引。对右侧列的约束 这些列在索引中被检查,因此它们保存对 表正确,但它们不会减少索引的部分 被扫描。

    似乎 PostgreSQL 在这方面的行为与 MySQL 相同。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-10
      • 1970-01-01
      • 2016-04-04
      相关资源
      最近更新 更多