mysql - 为什么 LIMIT 1 在这种情况下会导致 MySQL 超时?
问题描述
我们目前正在处理一个奇怪情况下的慢查询。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
吗?
解决方案
添加复合材料
INDEX(user, timestamp_col)
这样WHERE
,ORDER BY
、 和LIMIT
都由索引处理。并且它会在获得所需的LIMIT
.
任何单列索引都需要读取大量行和/或对这些行进行排序。
推荐阅读
- hadoop - 如何解决这个 Hadoop core-site.xml 问题?
- java - Android Fatal signal 11 (SIGSEGV) 轮盘教程
- python - 如何在其他方法中访问类属性变量
- xml - 如何根据兄弟属性值从元素中获取文本值?
- mysql - 使用 scala slick 重写此 SQL 查询
- algorithm - 图形变化 - 为了只有一个最小生成树
- html - 单击事件在 HTML Jquery 中不起作用
- symfony - Symfony Sonata 管理面板按出现次数排序(doctrin query builder)
- flutter - 带有 statefull 小部件的 Flutter listview builder 不会使用父小部件中的设置状态进行更新
- python - Dash 应用程序在选项卡之间切换时防止自动刷新