【问题标题】:json_object() and `group by` Optimisation in MySQLMySQL 中的 json_object() 和 `group by` 优化
【发布时间】:2022-11-11 02:24:26
【问题描述】:

我的查询遇到了优化问题,一旦我在查询中使用聚合 GROUP BYJSON_OBJECT(),性能就会受到严重影响,而且似乎 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;

【问题讨论】:

  • 嗨,不必大喊你的头衔
  • @RiggsFolly 确实,感谢您的编辑
  • 请您阅读Tips for asking a good Structured Query Language (SQL) question) 并相应地修改您的问题。
  • mysql 必须读取每一行来解码 json,然后才能进行任何计算或分组。
  • @FreudianSlip 但是如何在 group by 之后创建我的 json 对象和数组?

标签: mysql json performance optimization query-optimization


【解决方案1】:

一般来说,JSON 应该用于存储结构化数据只要该应用程序需要查看内部。它很笨拙,可能非常MySQL 挑选 JSON 用于WHEREGROUP BY 等的效率低下。

至于GROUP BY(或ORDER BY)加上LIMIT 1

仅使用LIMIT,MySQL 只需剥离它找到的第一行。 - 快多了,你得到哪一行是不可预测的。

使用 Group 或 Order,它可能必须收集所有可能的行,对它们进行处理(分组或排序),并且只有那时剥去 1 行。 ——慢得多。

听起来您在每个 JSON 中都有一个“数组”? RDBMS 等价物涉及第二个桌子处理所有这些数组——每行一个元素。切换到那个可能导致更快的代码。 (我不太了解您的数据,无法为您提供具体建议。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-05-04
    • 1970-01-01
    • 1970-01-01
    • 2012-06-12
    • 2012-07-26
    • 2012-10-20
    相关资源
    最近更新 更多