mysql - LIMIT 1 怎么可能使查询变慢
问题描述
鉴于 MySQL 5.6 中的此表:
create table PlayerSession
(
id bigint auto_increment primary key,
lastActivity datetime not null,
player_id bigint null,
...
constraint FK4410E05525A98981
foreign key (player_id) references Player (id)
)
这个查询怎么可能立即返回大约 2000 行:
SELECT * FROM PlayerSession
WHERE player_id = ....
ORDER BY lastActivity DESC
但是添加LIMIT 1
会使它花费 4 秒,即使应该做的只是选择第一个结果?
使用EXPLAIN
我发现唯一的区别是没有限制,filesort
使用。据我所知,这应该使它更慢,而不是更快。整个表包含大约 2M 行。此外,添加LIMIT 3
或高于此的任何内容都可以提供与无限制相同的性能。
是的,我已经在 上创建了一个索引playerId, lastActivity
,令人惊讶的是,它又让它变快了。虽然这会立即消除这种情况的压力(服务器相当过载),但这并不能真正解释其中的奥秘。
解决方案
5.6具体是什么版本?请提供EXPLAIN FORMAT=JSON SELECT ...
。请提供SHOW CREATE TABLE
;我们需要查看其他索引以及数据类型。
INDEX(playerId, lastActivity)
让查询避免“文件排序”。
奇怪时间的一个可能原因可能是缓存。运行每个查询两次以避免打嗝。
推荐阅读
- python - 为什么此代码在全局变量中设置 True 和 False?
- c - 检测到堆栈粉碎 - 通过指针更新函数中的结构后中止
- php - 按元框值(wordpress)从数据库顺序中获取数据
- xamarin - 使用 Xamarin Forms 缩放 UWP 图像
- javascript - 我的应用程序输出 [object Object] 代替文本字符串 - 请问如何解决?
- css - 如何使用 CSS 网格在标准布局中强制嵌套动态组件 HTML 内容?
- excel - 如何解锁新 OLEObject 添加附件的纵横比?
- javascript - 如何在提交表单时显示引导模式?
- excel - 有没有办法用公式模拟excel中的过滤功能?
- java - 我正在尝试更改幻灯片中折线图的值,但无法使用 POI