我有一个包含SET
类型列的表,例如SET('abc','def','ghi')
,它存储像"abc,ghi"
这样的数据,并为这些列编制索引。因此,当我想查找"def"
或"ghi"
时,我必须使用LIKE "%def%"
,但我读到"%"
如果您将其用作第一个字符,则mysql不会使用+---------+
| column |
+---------+
| abc |
| abc,ghi |
| abc,def |
| ghi,def |
+---------+
搜索索引。我该怎么办?我应该将类型更改为枚举并将每个值存储在具有以下ID的单独行中:
+----+--------+
| ID | column |
+----+--------+
| 1 | abc |
| 2 | abc |
| 2 | ghi |
| 3 | abc |
| 3 | def |
| 4 | ghi |
| 4 | def |
+-------------+
更改为:
Tuple{Int, Int}[]
或者是否有任何操作索引来分别存储每个单词?
答案 0 :(得分:1)
在集合中查找项目的正确函数是FIND_IN_SET
。集合存储为位图,而不是字符串,FIND_IN_SET
在匹配LIKE
之前不必将其转换为字符串。但它仍然无法使用索引。
您的第二个架构是规范化数据的正确方法。您可以在column
列上放置索引,查找值的查询将非常有效。是否在此列中使用ENUM
或VARCHAR
是数据库社区中激烈争论的主题。