我的查询有一个优化问题,一旦我在我的查询中使用JSON_OBJECT()
的聚合GROUP BY
,性能受到严重影响,并且似乎JSON_OBJECT()
函数被称为表中的每一行,即使有LIMIT
。
一旦没有更多的GROUP BY
,查询执行得非常快。我抽象的查询,我使用到最简单的,但我需要GROUP BY
原因
我正在使用JSON_ARRAYAGG()进行另一个连接。
我在我的表中得到了~25k行,当通过聚合
删除组时,需要的时间减少了10倍。select JSON_OBJECT('id',`b`.`id`) as bw
from a
left join `b` on `a`.`id` = `b`.`id_a`
group by `a`.`id`
LIMIT 1;
一般来说,JSON应该用于存储结构化数据,只有应用程序需要查看这些数据。这是笨拙的,可能非常非常效率低下的MySQL挑选JSON用于WHERE
,GROUP BY
等。
对于GROUP BY
(或ORDER BY
) +LIMIT 1
:
对于LIMIT
, MySQL只是剥离它找到的第一行。——快多了,但是你得到哪一行是不可预测的。
对于Group或Order,它可能必须收集所有可能的行,将它们组合(分组或排序),然后才会剥离1行。——慢多了。
听起来你有一个"数组"每个JSON中有多少东西?RDBMS的等效方法涉及第二个表来处理所有这些数组——每行一个元素。切换到可能会导致更快的代码。(我不太了解你的数据,不能给你具体的建议。)