mysql json交集_MySQL如何搜索JSON字段中与JSON值相交的所有行

匿名用户

来自@gordonlinoff的回答给出了正确的结果,但值得一提的是,大多数使用JSON函数的解决方案都不能用索引进行优化。您应该考虑当表变大时会发生什么。每个查询都将执行一次表扫描,而且随着表的增长,性能会变得越来越差。

EXPLAIN显示了这一点:+----+-------------+----------+------------+------+---------------+------+---------+------+------+----------+-------------+

| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |

+----+-------------+----------+------------+------+---------------+------+---------+------+------+----------+-------------+

| 1 | SIMPLE | projects | NULL | ALL | NULL | NULL | NULL | NULL | 1 | 100.00 | Using where |

+----+-------------+----------+------------+------+---------------+------+---------+------+------+----------+-------------+

(列将与表中的行数一样大)

相反,实现这种查询的一种更容易的方法是将数据存储在普通的行和列中,而不是JSON中。每行存储一个project_id。

然后查询变得更加清晰,并且可以使用索引对其进行优化:SELECT * FROM projects WHERE project_id IN (1, 2);

我知道您在问题中提到,我们应该把使用JSON作为一个既定的要求。您有一个解决方案来得到您所描述的结果。我只想跟其他读者说清楚:

如果您的查询在select-list以外的任何子句中引用了JSON列,这表明您应该以规范化的形式存储数据,而不是以JSON的形式存储数据。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值