【发布时间】:2019-06-26 02:13:58
【问题描述】:
鉴于 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 上创建了一个索引,令人惊讶的是,它又让它变得更快了。虽然这可以消除这种情况的直接压力(服务器相当过载),但这并不能真正解释其中的奥秘。
【问题讨论】:
-
您应该使用查询计划器来观察这两个查询之间的性能。我认为您使用的索引错误导致使用 LIMIT 子句重新计算。
-
我想你已经回答了你自己的问题。当使用
LIMIT 1并且没有索引时,数据库选择了错误的执行计划。
标签: mysql sql query-performance mysql-5.6