mysql查询在live中超时,但在local中未超时

aoyhnmkz  于 2021-06-20  发布在  Mysql
关注(0)|答案(2)|浏览(376)

我们正在使用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 没有第一场比赛。

b09cbbtk

b09cbbtk1#

实际上,如果“status”字段在childs表中,您甚至可以不使用parents或user表从单个查询中获取所有数据。
从基本的传递联想,

if A = B and B = C, then A = C.

您将通过id从子级加入到用户,然后查看用户id=“123456”。
这与只询问childs相同。user\u id=“123456”。
同样,从child.parent\u id连接到父项的子项来看,您的查询似乎试图获取与给定子项关联的不同父项id的计数。
所以,下面应该可以得到你需要的。

select 
        count( distinct c.Parent_id ) Aggregate
    from
        childs c
    where
            c.user_id = '123456'
        AND c.status = 'OK'

如果status字段在父表上,则需要连接到该表

select 
        count( distinct c.Parent_id ) Aggregate
    from
        childs c
            join parents p
                on c.parent_id = p.id
                AND p.status = 'OK'
    where
            c.user_id = '123456'

为了提高性能,我还将在childs表上设置一个索引(user\u id,parent\u id)。这也可以显著优化查询。

k5ifujac

k5ifujac2#

这可能相当于:

select  count(*) as aggregate
    from  `parents` AS p
    where  exists (
        SELECT  *
            from  `childs` AS c
            JOIN  users AS u  ON c.user_id = u.id
            WHERE  c.user_id = 123456
              AND  p.`id` = c.`parent_id`
              and  `status` = 'OK' 
        )
``` `OPTIMIZE TABLE` 很少有用。
哪张table是 `status` 在哪?

相关问题