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

标签 mysql indexing where-clause

我有一个包含 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/

相关文章:

mysql - 获取最接近的小于值

php - 如何将我的 Perl 脚本与 MySQL 查询同步

mysql - Bash:当服务器出现故障时关闭 MySQL 连接

python - 列表索引 - 如果太大则返回到列表的开头

sql-server-2005 - 如何在 where 子句中调用存储过程

mysql - mysql 查询中的 WHERE 语句中可以有 OR 吗?

MySQL语法错误异常 : Error while upgrading MySQL version

Lucene - 读取存储的所有字段名称

asp.net - 监控服务器和网站 - 设计问题

非规范化表上的 MySQL WHERE 子句