2009-12-03 98 views
15

只是一个简单的问题,但索引的顺序跨越多列时很重要吗?多列索引的顺序

例如,服用查询:

 
SELECT * FROM my_table WHERE (column_1 = 1 AND column_2 = 2) 

如果我想添加一个索引像这样的查询,它的问题,如果我的索引创建这样的:

 
CREATE INDEX my_index 
ON my_table (column_1, column_2) 

或者像这样:

 
CREATE INDEX my_index 
ON my_table (column_2, column_1) 

感谢您的帮助!

回答

21

在您给出的示例中,列顺序无关紧要。

如果你在一个专栏上订购,这很重要; (col1,col2)上的索引可用于ORDER BY col1, col2,但不适用于ORDER BY col2, col1

对于WHERE子句,(col1, col2)上的索引适用于WHERE col1 = 1 AND col2 = 1。它也适用于WHERE col1 = 1。但它不能帮助WHERE col2 = 1

+4

事实上,即使在这种情况下它也可能很重要。如果几乎每行都有col1 = 1,那么如果col2是第一个,那么索引很可能会更好,即使您正在查询两者。 – 2009-12-03 15:47:52

+3

在所提供的例子中,如果一列具有比另一列高的丰富性,那么它也可能很重要。首先选择高选择性(许多不同的值)的列。 – Manu 2009-12-03 15:47:58

+0

在这个答案中的优秀信息,以帮助理解如何击中已经在系统上可用的索引。 – Swoop 2011-06-29 13:23:44

0

找出最好的方法是测量它。尝试一个,衡量性能,然后删除该索引,并尝试其他。通常,您希望一起查询的数据在磁盘上的索引中靠近在一起,并且索引中列的顺序与索引存储在磁盘上的方式有所不同。很难准确猜测哪些索引组合最适合,所以请尝试一些不同的可能性和措施,以找出哪些数据最适合您。