MySql查询性能之谜

标签 mysql performance

我有两个看起来或多或少相同的查询,但它们的性能却大不相同,我不明白为什么。基本上,我有一个很大的博客表(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/

相关文章:

python - 计算数据框列中每个值的百分位数

java - 单独线程中的屏幕捕获导致 Java 应用程序缓慢/无响应

python - Eratosthenes 筛法速度比较 : Python vs Julia

mysql - 使用2个表查询获取0的记录数

c# - 无法在 C# 应用程序上远程连接到数据库,我可以通过访问该服务器的 phpmyadmin 站点来查看该数据库

mysql - 如何在动态SQL查询中设置用户定义的变量?

python - 从 Celery 结果后端 MYSQL 查询结果

php - 根据列名将查询拆分为多个数组

python - 加速django嵌套for循环时间序列

performance - 对于动态游戏场上拥有大量 AI 的游戏来说,哪种导航方法最高效、最灵活?