优化DISTINCT / LIMIT MySQL查询分页

时间:2011-02-14 23:13:01

标签: mysql optimization pagination group-by limit

我有以下SQL:

SELECT group_id FROM products WHERE category = 12345 GROUP BY group_id LIMIT 0, 10

或:

SELECT DISTINCT group_id FROM products WHERE category = 12345 LIMIT 0, 10

LIMIT用于分页。我想知道如何避免MySQL查找所有行,直到找到我想要的10个不同的group_id。例如,如果我这样做:

SELECT DISTINCT group_id FROM products WHERE category = 12345 LIMIT 200, 10

它将扫描前200行的类别= 12345,而不是开始收集10个不同的group_ids?

更新:如果我在(group_id,category)上创建索引怎么办?

1 个答案:

答案 0 :(得分:1)

您的查询将找到前200个不同的行,然后输出下一个10行。DISTINCTLIMIT之前完成。根据索引以及表的存储方式,它可以在满足limit子句后停止收集唯一值。如果您希望distinct的值被编入索引,则最有可能。

(顺便说一句,如果您使用LIMIT 10 OFFSET 200而不是旧的非直观LIMIT 200, 10表示法,则可以提高查询的可读性。)