我有一个包含 SET
类型列的表,例如 SET('abc','def','ghi')
,它存储像 "这样的数据abc,ghi"
并且我为这些列建立了索引。因此,当我想查找 "def"
或 "ghi"
时,我必须使用 LIKE "%def%"
但我读到了 >"%"
如果你使用它作为第一个字符,mysql不会使用索引进行搜索。我该怎么办?我应该将类型更改为枚举并将每个值存储在单独的行中,其 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
列上放置索引,并且查找值的查询将非常高效。对于此列是否使用 ENUM
还是 VARCHAR
是数据库社区内激烈争论的话题。
关于mysql - "where"或 "like"子句更适合使用索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33270859/