为什么在带通配符的 LIKE 查询中不使用索引?

Why is an index not used on a LIKE query with wildcards?

尽管使用以下查询将标题列添加为索引:

ALTER TABLE Recipe ADD INDEX Title_idx (Title)

MySQL 没有为这个查询使用那个索引:

SELECT * FROM Recipe
WHERE Title LIKE '%cake%';

我使用了EXPLAIN关键字,关键字段是NULL

如何解决?我必须改进该查询。

因为索引从字符串的开头开始。由于您在标题中的任何位置查找子字符串,因此无法使用索引。

这可以利用索引

WHERE Title LIKE 'cake%';

但这不是

WHERE Title LIKE '%cake%';

您需要全文索引才能部分匹配。考虑像 phone 书这样的普通索引:它非常适合按姓氏然后按名字查找人,比如 "Smith, John",但对于查找姓名中带有 "ith" 的人来说毫无用处,您将必须逐条手动匹配。

任何说 LIKE '%x%' 的查询都将自动成为 table 扫描。这不会针对非平凡大小的 tables.

进行缩放