有没有办法对 MySQL 中的列中的多个值建立索引

问题描述 投票:0回答:3

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

我的桌子如下:

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

如果我想查询类型为A和C的用户,应该得到123 如果有 B 和 C 则 123, 234

编辑:我知道这个问题可以通过标准化来解决。然而,我的表实际上存储 json,并且该字段是引用列表的虚拟列。任何地方都没有使用任何关系。我们面临一个问题,即未考虑按类型查询,现在正在造成性能影响

mysql sql normalization
3个回答
1
投票

首先,您应该“规范化”您的表格并删除 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
投票

但是,这不是你的问题。您

可以

创建索引来执行您想要的操作。这样的索引将是全文索引,允许您使用 match()

。如果您采取这种方法,您需要非常小心:

查询时需要使用布尔模式
  • 您需要设置最小单词长度,以便单个字符被识别为单词。
  • 您需要检查停用词列表,因此包含“A”和“I”等单词。
  • 所以,你想做的事情

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

从 MySQL 8.0.17 开始,MySQL 支持 JSON 列的“多值索引”。 这似乎正是你的情况。

1
投票
详细信息:

https://dev.mysql.com/doc/refman/8.3/en/create-index.html#create-index-multi-valued

© www.soinside.com 2019 - 2024. All rights reserved.