加入子查询的性能极其糟糕

问题描述 投票:0回答:1

我有以下疑问:

select count(*), 
    json_arrayagg(json_object('ID', o.ID, 'RECEIVERS', r.RECEIVERS, 'PRODUCTS', p.PRODUCTS))
from orders as o
inner join (
    select id,
        json_arrayagg(json_object('firstName', FIRST_NAME, 'lastName', LAST_NAME)) RECEIVERS
    FROM receivers
    group by id
) r on o.id = r.id
  inner join (
    select id,
        JSON_ARRAYAGG(JSON_OBJECT('type', TYPE)) PRODUCTS
    FROM PRODUCTS
    group by id
) p on o.id = p.id
where o.ID = "1"

这正是我想要的,它将返回如下所示的结构:

[{
    "ID": "1",
    "ORDERN_NUM": "123",
    "RECEIVERS": [{
        "FIRST_NAME": "Pete",
        "LAST_NAME": "Tyler"
    },
    {
        "FIRST_NAME": "Sarah",
        "LAST_NAME": "Bowden"
    }],
    "PRODUCTS": [{
        "TYPE": "Towel"
    },
    {
        "TYPE": "Pen"
    }]
}]

但是我最近加载了三个表,它们之间有 1800 万行。 ORDERS 表中有 200 万个,RECEIVERSPRODUCTS 各有 8 个。

在进行性能测试时,我最初在进行任何查询时都看到

1114 the table xyz is full
错误。此后,我将
temptable_max_mmap
temptable_max_ram
分别提升至 12GB 和 6GB。这至少允许完成查询。

但是,当我在 Aurora Serverless V2 MySQL RDS 数据库上运行单个查询时,使用一个参数,来自 ORDERS 的 PK - 这是 RECEIVERSPRODUCTS 中的外键 - 查询需要五分钟执行时,在 4/16 最小/最大设置下消耗 100% ACU 使用率,并消耗 40GB 总内存利用率..

我对此感到非常惊讶,想知道是否有人能深入了解我在查询中可能错过的内容?我相当确定此时它的性能不是很好,但我无法找到另一种方法来使其高性能并返回我想要的东西。

索引会对此产生任何影响吗?甚至会使情况变得更糟吗?

sql mysql amazon-rds amazon-aurora
1个回答
0
投票

如果没有横向联接,“等效”是 select 子句中的“相关子查询”,这些通常是性能问题,因为相关子查询是通过结果集逐行执行的:

SELECT
          left_table.*
    , (SELECT string_agg(right_table.session_id, ',') 
           FROM data right_table WHERE left_table.source_ip = right_table.source_ip
        AND (
            (
                right_table.session_start_time >= left_table.session_start_time
                AND right_table.session_start_time <= left_table.session_end_time
                )
            OR (
                right_table.session_end_time >= left_table.session_start_time
                AND right_table.session_end_time <= left_table.session_end_time
                )
            ) GROUP BY right_table.source_ip)  x
FROM data left_table

nb:横向连接以更有效的方式执行(作为 from 子句的一部分)。

© www.soinside.com 2019 - 2024. All rights reserved.