LIMIT 1如何使查询变慢

时间:2019-02-01 13:29:35

标签: mysql sql query-performance mysql-5.6

在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上创建了一个索引,这令人惊讶,令人惊奇的是,它使速度又很快了。尽管这样可以立即缓解压力(服务器已超负荷运行),但并不能真正解释其奥秘。

1 个答案:

答案 0 :(得分:0)

5.6的哪个特定版本?请提供EXPLAIN FORMAT=JSON SELECT ...。请提供SHOW CREATE TABLE;我们需要查看其他索引以及数据类型。

INDEX(playerId, lastActivity)可让查询避免 “文件排序”。

奇怪的时间可能是缓存。每个查询运行两次,以免打h。