"where" 或 "like" 子句更适合使用索引

"where" or "like" clause is better for using index

我有一个 table,其中包含类型为 SET 的列,例如 SET('abc','def','ghi') 存储 "abc,ghi" 之类的数据,我对这些列进行了索引。所以当我想找到 "def""ghi" 时,我必须使用 LIKE "%def%" 但我读到 "%" 如果你将它用作第一个字符 mysql 不会' t 使用索引进行搜索。我该怎么办?我应该将类型更改为枚举并将每个值存储在单独的行中,ID 如下所示:

+---------+
| column  |
+---------+
| abc     |
| abc,ghi |
| abc,def |
| ghi,def |
+---------+

更改为:

+----+--------+
| ID | column |
+----+--------+
| 1  | abc    |
| 2  | abc    |
| 2  | ghi    |
| 3  | abc    |
| 3  | def    |
| 4  | ghi    |
| 4  | def    |
+-------------+

或者有什么东西可以操纵索引来单独存储每个单词吗?

在集合中查找项目的正确函数是 FIND_IN_SET。集合存储为位图,而不是字符串,并且 FIND_IN_SET 不必像 LIKE 那样在匹配之前将其转换为字符串。但它仍然无法使用索引。

您的第二个模式是规范化数据的正确方法。您可以在 column 列上放置一个索引,查找值的查询会很高效。是否为此列使用 ENUMVARCHAR 是数据库社区内激烈争论的主题。