【问题标题】:How can LIMIT 1 possibly make a query slowerLIMIT 1 怎么可能使查询变慢
【发布时间】: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


【解决方案1】:

5.6 的具体版本是什么?请提供EXPLAIN FORMAT=JSON SELECT ...。请提供SHOW CREATE TABLE;我们需要查看其他索引以及数据类型。

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

奇怪的时间安排的一个可能原因可能是缓存。将每个查询运行两次以避免出现问题。

【讨论】:

    猜你喜欢
    • 2019-05-09
    • 1970-01-01
    • 1970-01-01
    • 2019-08-16
    • 1970-01-01
    • 2023-03-21
    • 1970-01-01
    • 2012-06-08
    • 1970-01-01
    相关资源
    最近更新 更多