有没有任何高效的方法可以在 mysql 5.7 中对多个值运行 JSON_CONTAINS 查询

问题描述 投票:0回答:1

我在 mysql json 列中有一个对象数组,我想查询其中一个对象包含值列表中的成员的所有行。

继续这个问题

SELECT * 
FROM   sometable 
WHERE  (   JSON_CONTAINS(json, JSON_OBJECT('id', '1'), '$') 
        OR JSON_CONTAINS(json, JSON_OBJECT('id', '2'), '$') 
        OR JSON_CONTAINS(json, JSON_OBJECT('id', '3'), '$') 
       )

比执行三个查询慢 3 倍。有没有更高效的方法?

mysql-5.7
1个回答
0
投票

您可以通过直接定位属性来获得一些时间,因为比较对象的时间要长得多,因为 Mysql 必须解析两者:

SELECT * FROM sometable
WHERE  (   JSON_CONTAINS(jsondata, '1', '$.id') 
        OR JSON_CONTAINS(jsondata, '2', '$.id') 
        OR JSON_CONTAINS(jsondata, '3', '$.id') 
       );

您还可以使用更简洁的方式使用

IN
运算符和 JSON_EXTRACT 快捷方式 :

SELECT * FROM sometable WHERE jsondata->"$.id" IN (1,2,3)

我做了一个快速小提琴来说明,它的平均速度似乎是原来的两倍(db-fiddle 在处理时间上并不总是一致)

无论如何,在 Mysql 中搜索非索引列总是很痛苦。如果可以的话,您可以考虑使用 从 json 生成的可以索引的列。

我做了一个其他小提琴你可以检查一下。

© www.soinside.com 2019 - 2024. All rights reserved.