当前,我的表中有一列,其中包含一组用逗号分隔的值。我目前正在使用它来过滤结果。我想知道是否有可能对其进行索引并直接使用它进行查询。
我的表格如下:
userId types
123 A, B, C
234 B, C
如果我要查询具有A和C类型的用户,应该得到123 如果是B和C,那么123、234
编辑:我知道可以通过规范化解决问题。但是我的表实际上存储的是json,并且此字段是引用列表的虚拟列。在任何地方都没有使用关系。我们面临的一个问题是,不考虑按类型查询,现在对性能产生影响
答案 0 :(得分:2)
首先,您应该对表进行规范化并删除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);
此索引实际上应涵盖上面的整个查询。
答案 1 :(得分:1)
答案基本上是。 。 。但不是真的。重要的一点是,您应该重组数据并将其正确存储。 “正确”表示不使用字符串列存储多个值。
但是,这不是您的问题。您可以创建索引以执行所需的操作。这样的索引将是全文索引,允许您使用match()
。如果您采用这种方法,则需要非常小心:
因此,您想做的 是可能的。但是,不建议这样做,因为数据的格式不正确。