7

如这个问题所示: 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
4

2 回答 2

20

对于 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 的工作方式可能不同

于 2012-11-08T22:07:02.780 回答
7

对于 PostgreSQL:

PostgreSQL:文档:多列索引说:

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

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

于 2012-11-09T00:01:41.303 回答