我们正在使用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 on local and live shows a difference,其中一个与父表和子表相关的可能键的依赖子查询显示
Using where; FirstMatch(closing_batches)
但只有现场表演 Using where
没有第一场比赛。
2条答案
按热度按时间b09cbbtk1#
实际上,如果“status”字段在childs表中,您甚至可以不使用parents或user表从单个查询中获取所有数据。
从基本的传递联想,
您将通过id从子级加入到用户,然后查看用户id=“123456”。
这与只询问childs相同。user\u id=“123456”。
同样,从child.parent\u id连接到父项的子项来看,您的查询似乎试图获取与给定子项关联的不同父项id的计数。
所以,下面应该可以得到你需要的。
如果status字段在父表上,则需要连接到该表
为了提高性能,我还将在childs表上设置一个索引(user\u id,parent\u id)。这也可以显著优化查询。
k5ifujac2#
这可能相当于: