【发布时间】:2014-03-26 14:40:05
【问题描述】:
我有一个 MySQL 表,里面有 4200 万条记录。 此表中的“名称”字段有索引(不是唯一且不是 PK)
如果我使用
SELECT x FROM table WHERE name='asdef'
它使用索引,我很快就得到了结果。
如果我使用
SELECT x FROM table WHERE name LIKE '%sd%'
即使我使用FORCE INDEX 或USE INDEX,它也不使用索引。
我绝对需要进行部分匹配。如何在保持字段为 VARCHAR 的同时做到这一点?
【问题讨论】:
-
在这种情况下数据库会如何处理索引?您的匹配以通配符开头,因此顺序无关紧要。它必须查看匹配的每个名称值。假设“x”不仅仅是“名称”,那么数据库也可能会遍历表行。如果您的匹配模式是恒定的并且您需要经常进行此查找,也许您可以在插入时检查此条件并有一个单独的列(例如“has_sd”)和索引,以便您可以快速查找。
-
@sbaker 我无法检查它,因为
name我无法猜测我搜索的内容,它是由用户动态定义的。 -
MySQL(与 Postgres 不同)不能为
LIKE '%sd%'使用索引。查看内置的全文搜索。
标签: mysql sql database indexing database-indexes