like 查询不拖慢的关键是仅用前缀匹配(如'张%')以走索引;中间/结尾模糊需改用全文索引、物化列或同义词映射。

LIKE 语句怎么写才不拖慢查询
MySQL 的模糊搜索主要靠 LIKE,但直接用 %关键词% 会让索引完全失效。比如 WHERE name LIKE '%张%',哪怕 name 字段有索引,也会全表扫描。
真正能走索引的只有前缀匹配: WHERE name LIKE '张%'(开头固定,后面模糊)。如果必须中间或结尾匹配,优先考虑以下替代方案:
- 把常用模糊模式提前物化:比如加一列
first_char存首字母,last_char存末字符,用等值查询加速 - 对短文本(如用户名、标签)建全文索引,配合
MATCH ... AGAINST,比LIKE更准也更快 - 避免在大字段(如
TEXT)上直接LIKE,先加WHERE length 过滤再模糊
中文模糊搜索为什么经常查不到字
根本原因是字符集和排序规则不匹配。比如表用 utf8mb4_unicode_ci,但客户端连接用的是 latin1,输入“李”可能被转成乱码再比对。
检查并统一三处配置:
- 建表时指定:
CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci - 连接时显式声明:执行
SET NAMES utf8mb4或在连接字符串里加?charset=utf8mb4 - 如果用正则(
REGEXP),注意utf8mb4下部分汉字会被当作多个码点,建议改用LIKE或全文索引
想搜“苹果手机”但也要命中“iPhone”怎么办
这是业务层面的同义词问题,MySQL 本身不提供词义映射。硬拼 OR 条件(name LIKE '%苹果%' OR name LIKE '%iPhone%')可解燃眉,但不可维护。
更可持续的做法是引入轻量级映射层:
- 建一张
keyword_alias表,存canonical_term(标准词)和alias(别名),查询前先查出所有 alias,拼成IN或多个LIKE - 在应用层做预处理:用户输“苹果手机”,后端自动扩展为
['苹果手机', 'iPhone', 'ios手机'],再生成查询 - 不要依赖 MySQL 内置函数做动态同义替换——没有内置函数能可靠完成这件事
全文索引为什么建了还是没效果
常见原因不是语法错,而是被忽略的隐性限制:
- 默认最小词长是 4,搜“小米”(2 字)不会被索引,需改配置
ft_min_word_len=2并重启 MySQL,再重建索引 - 停用词表(
ft_stopword_file)可能把“的”“和”“我”等常用字过滤掉,查“我的手机”实际只索引“手机” -
MATCH必须和AGAINST配对使用,且字段必须属于同一个 FULLTEXT 索引,跨列或混合普通字段会报错ERROR 1191: Can't find FULLTEXT index
调试时先用 SELECT MATCH(title) AGAINST('测试词' IN NATURAL LANGUAGE MODE) FROM articles; 看返回是否非零,再逐步加条件。











