首页 > 解决方案 > 为什么 LIMIT 1 在这种情况下会导致 MySQL 超时?

问题描述

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

我们可以更改ORDER BY以使用不同的列,并且查询有效。我们可以删除LIMIT 1,并且查询有效。一旦我们将其更改为LIMIT1-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吗?

标签: mysqlperformancetimeout

解决方案


添加复合材料

INDEX(user, timestamp_col)

这样WHEREORDER BY、 和LIMIT都由索引处理。并且它会在获得所需的LIMIT.

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


推荐阅读