如何在Rails中正确指定多列索引

sak*_*ki7 7 mysql postgresql indexing ruby-on-rails

如此问题所示: 如何使列唯一并在Ruby on Rails迁移中将其编入索引?
你可以写:

add_index :the_table, [:foo_column, :bar_column], unique: true
Run Code Online (Sandbox Code Playgroud)

添加多列索引.
但是,是否仍需要为已经指定多列索引的每个列添加单个索引?

我的意思是上面显示的代码之外写下面的代码.

add_index :the_table, :foo_column  
add_index :the_table, :bar_column
Run Code Online (Sandbox Code Playgroud)

Ant*_*rto 19

对于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
Run Code Online (Sandbox Code Playgroud)

确保正确索引所有内容

MySQL从左到右索引列,所以如果你有这样的多列索引:[:col1, :col2, :col3, :col4],你可以查询这个索引:

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

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

如果您还需要其他任何东西,则必须创建更多索引

再次,这只适用于MySQL,postgres可能会有不同的工作方式


sak*_*ki7 6

对于PostgreSQL:

PostgreSQL:文档:多列索引说:

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

看起来PostgreSQL在这方面与MySQL的行为相同.