搜索框用 LIKE '%手机%',explain 里 type 是 ALL,200 万行商品表扫了 3.2 秒。换成 LIKE '手机%' 只要 40 毫秒。碰到这种情况,我一般先确认改动有没有真的生效。

原因不复杂,B+ 树按前缀有序,左侧带通配符就没有确定的起点,只能逐行做字符串匹配。索引在这种情况下完全用不上,扫描量和表大小直接挂钩。

「like 前置通配」这个问题文档写得含糊,实际行为以当前版本为准,别照旧版本的结论套。别只看报错的最后一行,往上看几行,真正的起因通常在上面。

ALTER TABLE products ADD FULLTEXT INDEX ft_name (name) WITH PARSER ngram;
SELECT id FROM products
WHERE MATCH(name) AGAINST('手机' IN BOOLEAN MODE);

同类问题如果隔一段时间又出现,多半是某个定时任务或重启流程把改动冲掉了。把这次用到的命令存进笔记,比记住结论有用,换个环境还能照着走。

具体做法是,能改成前缀匹配的就把左侧百分号去掉;必须中间匹配的用全文索引 或者接搜索引擎;数据量不大时至少把过滤条件收窄 让范围先走索引;确认不是排序规则导致索引失效。

最后用这个标准收尾,搜索接口耗时稳定在百毫秒内 explain 里出现 fulltext 而不是 ALL。

作者 9823189