有没有一种方法可以对MySQL中的列中的多个值建立索引

时间:2020-09-09 10:18:16

标签: mysql sql normalization

当前,我的表中有一列,其中包含一组用逗号分隔的值。我目前正在使用它来过滤结果。我想知道是否有可能对其进行索引并直接使用它进行查询。

我的表格如下:

userId        types
123           A, B, C
234           B, C

如果我要查询具有A和C类型的用户,应该得到123 如果是B和C,那么123、234

编辑:我知道可以通过规范化解决问题。但是我的表实际上存储的是json,并且此字段是引用列表的虚拟列。在任何地方都没有使用关系。我们面临的一个问题是,不考虑按类型查询,现在对性能产生影响

2 个答案:

答案 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()。如果您采用这种方法,则需要非常小心:

  • 查询时需要使用布尔模式。
  • 您需要设置最小单词长度,以便将单个字符识别为单词。
  • 您需要检查停用词列表,因此包含诸如“ A”和“ I”之类的词。

因此,您想做的 是可能的。但是,不建议这样做,因为数据的格式不正确。