目前我的表中有一个列,其中有一组逗号分隔的值。我目前正在使用它来过滤结果。我想知道是否可以对其进行索引并直接使用它进行查询。
我的桌子如下:
userId types
123 A, B, C
234 B, C
如果我想查询类型为A和C的用户,应该得到123 如果有 B 和 C 则 123, 234
编辑:我知道这个问题可以通过标准化来解决。然而,我的表实际上存储 json,并且该字段是引用列表的虚拟列。任何地方都没有使用任何关系。我们面临一个问题,即未考虑按类型查询,现在正在造成性能影响
首先,您应该“规范化”您的表格并删除 CSV 数据。使用这样的东西:
userId | types
123 | A
123 | B
123 | C
234 | B
234 | C
对于您想要的具体查询,您可以选择:
SELECT userId
FROM yourTable
WHERE types IN ('A', 'C')
GROUP BY userId
HAVING MIN(types) <> MAX(types);
考虑到这一点,MySQL 可能能够使用以下composite
索引:
CREATE INDEX idx ON yourTable (userId, types);
这个索引实际上应该覆盖上面的整个查询。
但是,这不是你的问题。您
可以创建索引来执行您想要的操作。这样的索引将是全文索引,允许您使用 match()
。如果您采取这种方法,您需要非常小心:查询时需要使用布尔模式
可能的。但是,不建议这样做,因为数据不是正确的关系格式。
从 MySQL 8.0.17 开始,MySQL 支持 JSON 列的“多值索引”。 这似乎正是你的情况。