首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在查询中使用JSON数组值的MySQL成员?

在查询中使用JSON数组值的MySQL成员?
EN

Stack Overflow用户
提问于 2022-11-11 20:07:06
回答 3查看 23关注 0票数 1

我们有一个系统,以一个JSON数组作为参数来定义匹配的记录。为了保持简单,我们有一个查询:

代码语言:javascript
运行
复制
SELECT ai.ID 
FROM association_internal ai 
WHERE ai.source_object_record_id MEMBER OF('[57928,57927]');

现在,上面的调用需要380 is,这是荒谬的。为什么?因为以下版本的完全相同的调用需要11 of。

代码语言:javascript
运行
复制
SELECT ai.ID 
FROM association_internal ai 
WHERE ai.source_object_record_id IN(57928,57927);

只要使用IN与成员,它就能正常工作。成员是如此缓慢,它(诚实地)在企业环境中是不可用的。我们拥有的数字越多,速度就越慢(在上面的例子中,我们可以使用100+ )。

显然,有一些疯狂的缓慢处理的成员(也许它甚至是避免索引?)但是我们不能将JSON数组作为IN的属性传递。现在我可以编写动态SQL并手动执行它,但这是丑陋和草率的。

因此,问题是--是否有一种方法可以传递一个JSON数组,以便在不使用其成员的硬编码查询中使用?就像硬编码IN值一样快?还是将JSON数组的值转换为可用的IN或存在用例的方法?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2022-11-11 20:35:25

真让人难以相信。使用JSON_TABLE只需12 to即可转换数组。所以我可以以CTE的形式预先加载任何数组,然后使用IN,它可以闪电般的速度。

为了清楚起见,解决办法是:

代码语言:javascript
运行
复制
WITH frontload_array AS
(
  SELECT jt.ID 
  FROM JSON_TABLE('[1,2,3,4,5]', '$[*]' COLUMNS(ID int PATH '$')) AS jt
)
SELECT ai.ID 
FROM association_internal ai 
WHERE ai.source_object_record_id IN(SELECT ID FROM frontload_array);
票数 0
EN

Stack Overflow用户

发布于 2022-11-11 21:12:31

优化此查询的正确方法是对数组中的每个元素使用离散值的IN()。不能对逗号分隔的字符串进行优化比较。

代码语言:javascript
运行
复制
SELECT ai.ID 
FROM association_internal ai 
WHERE ai.source_object_record_id IN(?, ?, ?, ...);

在数组中创建尽可能多的?占位符,并将每个元素作为标量绑定到每个参数。

这不是丑陋或草率,这是正确的方式使用SQL。当您用Java或其他语言编写函数时,您是否将参数作为逗号分隔的字符串传递,并期望该函数拆分该字符串?不-每个参数都会传递一个单独的值。

票数 0
EN

Stack Overflow用户

发布于 2022-11-11 22:08:59

JSON是一个字符串;必须对其进行解析才能查看其中包含的内容。而且,在大多数情况下,查询必须查看每一行;没有快捷方式。

RDBMS是一种经过优化以获取信息的结构。在使用INDEXes时尤其如此。

对JSON的索引是最小的,您必须工作才能得到它们--例如使用“生成”列。

JSON用于WHEREGROUP BYORDER BY中不需要的内容。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74407603

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档