在使用索引的同时使用ORDER BY

时间:2013-08-07 20:53:45

标签: mysql sql sql-order-by

我想利用列A和B上的索引检索一些行。我被告知确保我的索引用于检索行的唯一方法是使用ORDER by子句,例如:

A  B  offset
1  5   1
1  4   2
2  5   3
2  4   4

SELECT A,B FROM TableX 
WHERE offset > 0 AND offset < 5 
ORDER BY A,B ASC

但是我希望我的结果只返回那些按行B而不是A,B排序的行。

A  B
1  4  
2  4    
2  5   
1  5 

如何执行此操作并仍然确保使用索引而不是全表扫描?如果我使用ORDER BY B那么这是不是意味着MySQL会扫描B并且打败了拥有两列索引的目的?

3 个答案:

答案 0 :(得分:2)

包含A或B列的任何索引都不会影响您的查询,无论您的ORDER BY如何。您需要offset上的索引,因为这是WHERE子句中使用的字段。

答案 1 :(得分:1)

抱歉,但也许我不明白这个问题..

上面的输出查询应该是:

A   B
1   4
1   5
2   4
2   5

为了避免表扫描,您应该为偏移量添加索引并在WHERE子句中使用它。

如果可能使用unique,请使用它。

  

在TableX(偏移)上创建UNIQUE INDEX offsetidx;

  

在TableX(偏移)上创建INDEX offsetidx;

答案 2 :(得分:1)

考虑到您的查询,最佳索引可能是(offset,A,B)。这将允许优化器使用索引的最左边部分来支持WHERE子句,并允许使用merge sort的索引的其余部分。

ALTER TABLE TableX ADD INDEX (offset,A,B);

为了充分利用这一点,必须将查询重写为:

SELECT A,B FROM TableX 
WHERE offset BETWEEN 0 AND 5 
ORDER BY A,B;

请参阅http://sqlfiddle.com/#!2/c8e718/2