在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
上创建了一个索引,这令人惊讶,令人惊奇的是,它使速度又很快了。尽管这样可以立即缓解压力(服务器已超负荷运行),但并不能真正解释其奥秘。
答案 0 :(得分:0)
5.6的哪个特定版本?请提供EXPLAIN FORMAT=JSON SELECT ...
。请提供SHOW CREATE TABLE
;我们需要查看其他索引以及数据类型。
INDEX(playerId, lastActivity)
可让查询避免 “文件排序”。
奇怪的时间可能是缓存。每个查询运行两次,以免打h。