"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
列上放置一个索引,查找值的查询会很高效。是否为此列使用 ENUM
或 VARCHAR
是数据库社区内激烈争论的主题。
我有一个 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
列上放置一个索引,查找值的查询会很高效。是否为此列使用 ENUM
或 VARCHAR
是数据库社区内激烈争论的主题。