匿名用户
来自@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的形式存储数据。