【发布时间】:2018-07-30 23:06:35
【问题描述】:
我们正在使用 MySQL InnoDB。
我们的查询看起来像这样。
在我们的实时环境中,此查询需要 30 多秒才能完成。
select count(*) as aggregate
from `parents`
where exists (
SELECT *
from `childs`
where `parents`.`id` = `childs`.`parent_id`
and exists (
SELECT *
from `users`
where `childs`.`user_id` = `users`.`id`
and `id` = '123456' )
and `status` = 'OK' )
所以我们已经导出了整个数据库并导入到我们本地的 mysql 数据库中。 令人惊讶的是,几乎是瞬间就获得了相同的查询结果。
因此,我们怀疑该表未优化,我们已执行以下操作。
optimize table users;
optimize table parents;
optimize table childs;
很遗憾,查询速度没有提高。
谁能看出哪里出了问题?
为什么在本地导出/导入(具有完全相同的结构数据)几乎是即时查询,并且直播需要将近 30-60 秒才能完成?
EXPLAIN 在本地和现场表演中有所不同, 与父表和子表相关的可能键的 DEPENDENT SUBQUERY 之一显示
Using where; FirstMatch(closing_batches)
但现场表演只有Using where 没有FirstMatch。
【问题讨论】:
-
能否在live和local上做一个EXPLAIN,看看是否应用了相同的执行计划?
-
嗨@Jacob 感谢您的提示,我已经按照您的建议进行了解释,发现缺少“FirstMatch”。这可能是什么原因造成的?
标签: mysql innodb database-optimization