【问题标题】:Optmize DISTINCT / LIMIT MySQL query for pagination优化分页的 DISTINCT / LIMIT MySQL 查询
【发布时间】:2011-06-27 06:32:45
【问题描述】:

我有以下 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

它将扫描类别 = 12345 的前 200 行,然后开始收集 10 个不同的 group_id?

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

【问题讨论】:

  • group_id 上有索引吗?这肯定会加快查找不同值的速度。我不确定您到底想要做什么 - 您想要从 10 个选择中选择不同的值,还是从不同的结果集中选择 10 个值?
  • 如果你在 group_idcategory 上放置一个索引,MySQL 可以简单地找到正确的 category 条目并吐出它在 group_id 一侧的所有内容,受 LIMIT 子句的约束.看起来您的代码根本没有任何问题。

标签: mysql optimization pagination group-by limit


【解决方案1】:

您的查询将找到前 200 个不同的行,然后输出接下来的 10 个。DISTINCTLIMIT 之前完成。根据索引和表的存储方式,一旦满足限制子句,它就可以停止收集唯一值。如果您想要区分的值已编入索引,则这种情况很可能发生。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-06
    • 2021-06-08
    相关资源
    最近更新 更多