You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MySQL中JSON_OBJECT()与GROUP BY的查询优化问题

问题分析与优化方案

问题根源

你的查询性能暴跌的核心原因是:GROUP BY会强制数据库先完成全表关联后的所有分组计算,再应用LIMIT。哪怕你只需要1条结果,数据库也会先对a与b关联后的全部数据(25k级)完成分组,同时对每一行执行JSON_OBJECT,最后才返回第一条分组结果——这就产生了大量不必要的计算。而移除GROUP BY后,数据库可以利用LIMIT提前终止查询,仅处理少量数据,速度自然大幅提升。

优化方案

1. 先过滤再分组,缩小处理范围

通过子查询先筛选出需要的a表记录(用LIMIT提前截断数据量),再关联b表执行分组和JSON函数,这样只会处理极小范围的数据:

SELECT JSON_OBJECT('id', `b`.`id`) AS bw 
FROM (
    -- 先获取目标a表记录,提前缩小处理范围
    SELECT `id` FROM `a` LIMIT 1
) AS filtered_a
LEFT JOIN `b` ON `filtered_a`.`id` = `b`.`id_a` 
GROUP BY `filtered_a`.`id`;

如果你的实际需求是配合JSON_ARRAYAGG聚合每组的b数据,调整为:

SELECT JSON_OBJECT('id', JSON_ARRAYAGG(`b`.`id`)) AS bw 
FROM (
    SELECT `id` FROM `a` LIMIT 1
) AS filtered_a
LEFT JOIN `b` ON `filtered_a`.`id` = `b`.`id_a` 
GROUP BY `filtered_a`.`id`;

2. 确保索引生效

  • 给a.id添加主键或普通索引,加速子查询的LIMIT和后续分组操作。
  • 给b.id_a添加索引,优化LEFT JOIN的关联速度,避免关联时的全表扫描。

3. 分组后再处理JSON函数(可选)

如果数据库对分组内的JSON函数优化不佳,可以先在子查询中拿到分组后的原始数据,再在外层生成JSON:

SELECT JSON_OBJECT('id', group_b_id) AS bw
FROM (
    SELECT `b`.`id` AS group_b_id
    FROM (
        SELECT `id` FROM `a` LIMIT 1
    ) AS filtered_a
    LEFT JOIN `b` ON `filtered_a`.`id` = `b`.`id_a` 
    GROUP BY `filtered_a`.`id`
) AS grouped_data;

效果验证

优化后的查询仅处理LIMIT指定的1条a记录对应的关联数据,JSON_OBJECT仅对该分组内的行执行,计算量大幅降低,性能会接近移除GROUP BY时的水平。

内容的提问来源于stack exchange,提问作者Elytes

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 03:45:35