我有以下疑问:
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 万个,RECEIVERS 和 PRODUCTS 各有 8 个。
在进行性能测试时,我最初在进行任何查询时都看到
1114 the table xyz is full
错误。此后,我将 temptable_max_mmap
和 temptable_max_ram
分别提升至 12GB 和 6GB。这至少允许完成查询。
但是,当我在 Aurora Serverless V2 MySQL RDS 数据库上运行单个查询时,使用一个参数,来自 ORDERS 的 PK - 这是 RECEIVERS 和 PRODUCTS 中的外键 - 查询需要五分钟执行时,在 4/16 最小/最大设置下消耗 100% ACU 使用率,并消耗 40GB 总内存利用率..
我对此感到非常惊讶,想知道是否有人能深入了解我在查询中可能错过的内容?我相当确定此时它的性能不是很好,但我无法找到另一种方法来使其高性能并返回我想要的东西。
索引会对此产生任何影响吗?甚至会使情况变得更糟吗?
如果没有横向联接,“等效”是 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 子句的一部分)。