gpt4 book ai didi

MySql查询性能之谜

转载 作者:行者123 更新时间:2023-11-29 00:59:02 25 4
gpt4 key购买 nike

我有两个看起来或多或少相同的查询,但它们的性能却大不相同,我不明白为什么。基本上,我有一个很大的博客表(600 万行),我需要锁定和处理这些博客。最初,查询看起来像这样:

insert into bloglock
select b.id, [lockid], CURRENT_TIMESTAMP
from blog b
left join bloglock bl
on b.id=bl.blogid
WHERE
State=[somestate]
AND
bl.BlogId IS NULL

它的语义是:通过在由博客 ID、锁 ID 和当前时间戳组成的 bloglock 表中创建一个条目来锁定博客。但仅当博客状态是我们要锁定的状态,并且博客尚未锁定(bl.BlogId IS NULL)时才执行此操作。

这个查询运行得非常快,大约 5/100 秒。

但后来我不得不强制某些博客在其他博客之前被处理。所以我添加了一个整数优先级字段,该字段的索引,并将查询更改为:

insert into bloglock
select b.id, [lockid], CURRENT_TIMESTAMP
from blog b
left join bloglock bl
on b.id=bl.blogid
WHERE
State=[somestate]
AND
bl.BlogId IS NULL
order by Priority desc
LIMIT 100;

与之前相同,只是它按优先级顺序获得前 10000 个。这个查询非常慢,执行大约需要 30 秒。我可以接受。但令人困惑的是,我将其重写为:

insert into bloglock
select *
from
(select b.id, [lockid], CURRENT_TIMESTAMP
from blog b
left join bloglock bl
on b.id=bl.blogid
WHERE
State=[somestate]
AND
bl.BlogId IS NULL
order by Priority desc
LIMIT 100) InnerQuery;

现在它的运行速度和以前一样快。我不明白这个。对我来说这似乎是同一个查询,当然我会认为它对优化器来说是一样的,但在性能上却有 60 倍的差异。这是怎么回事?

最佳答案

第三个查询应该比第二个查询更快,这没有逻辑上的理由。相信大家一定遇到过MySQL查询优化的bug。您可能会考虑为 MySQL 开发人员提交有关此问题的错误报告。

关于MySql查询性能之谜,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4630117/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com