【问题标题】:Why is LIMIT 1 causing MySQL to timeout in this situation?为什么 LIMIT 1 在这种情况下会导致 MySQL 超时?
【发布时间】:2021-12-03 23:39:24
【问题描述】:

我们目前正在处理一个奇怪情况下的慢查询。当我们LIMIT 将结果按 1、2、3、4、5、6 计算时,问题就出现了,但它适用于任何其他限制。此问题也仅限于这一特定用户。我们无法与任何其他用户重现缓慢/超时。

我们可以更改ORDER BY 以使用不同的列,这样查询就可以工作了。我们可以删除LIMIT 1,查询就可以了。一旦我们将LIMIT 更改为 1-6 之间的任何值,它就会超时。

我们可以将ORDER BY 设置在不同的列上,但这可能会导致将来出现报告问题,并且无法解决“为什么”会发生这种情况。

查询:

SELECT
         *
        FROM
            table_name tn 
        WHERE
            tn.user = '123'
        ORDER BY
            timestamp_col DESC
        LIMIT 1

还有我们的数据:

user --- timestamp_col --- 
123      2005-02-23 02:02:34
123      2005-03-21 00:12:30
123      2006-01-09 14:23:48
123      2006-01-10 15:01:05
123      2006-01-20 13:11:13
123      2006-10-20 20:08:00
123      2006-11-01 18:31:03
123      2006-12-01 09:10:12

timestamp订购时有什么特殊需求吗?

【问题讨论】:

  • 请添加两种情况的执行计划(explain select ... 的输出用于工作和非工作查询,例如限制 1 和限制 7)。

标签: mysql performance timeout


【解决方案1】:

添加合成

INDEX(user, timestamp_col)

这样WHEREORDER BYLIMIT 都由索引处理。并且在得到想要的LIMIT后会停止。

任何单列索引都需要读取大量行和/或对这些行进行排序。

【讨论】:

    猜你喜欢
    • 2021-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-13
    • 2017-12-24
    • 1970-01-01
    相关资源
    最近更新 更多