我想利用列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并且打败了拥有两列索引的目的?
答案 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;