0

我想使用 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 扫描并破坏拥有两列索引的目的?

4

3 回答 3

2

无论您的ORDER BY. 您需要一个索引,offset因为这是在 hteWHERE子句中使用的字段。

于 2013-08-07T21:01:37.643 回答
1

对不起,但也许我不明白这个问题..

上述输出查询应产生:

A   B
1   4
1   5
2   4
2   5

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

如果可能使用唯一的然后使用它。

CREATE UNIQUE INDEX offsetidx ON TableX (offset);

或者

CREATE INDEX offsetidx ON TableX (offset);

于 2013-08-07T21:01:09.237 回答
1

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

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

于 2013-08-07T21:39:19.857 回答