我在 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 必须解析两者:
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 生成的可以索引的列。
我做了一个其他小提琴你可以检查一下。