我有两个看起来或多或少相同的查询,但它们的性能差异很大,我无法弄清楚原因。基本上,我有一个大表(6M行)的博客,我需要锁定和处理。最初,查询看起来像这样:
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
这个语义是: 通过在bloglock表中创建一个包含博客ID,锁定ID和当前时间戳的条目来锁定博客。但只有在博客状态是我们想要锁定的情况下,以及博客是否尚未锁定(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;
与之前相同,只是它按优先顺序获得前100个。这个查询是狗慢,大约需要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倍。这是怎么回事?
答案 0 :(得分:1)
没有合理的理由说明为什么第三个查询应该比第二个查询更快。我相信你可能在MySQL的查询优化中遇到了一个错误。您可以考虑为MySQL开发人员提交有关此问题的错误报告。