MySQL模糊查询核心是LIKE和REGEXP,配合索引优化:LIKE前缀匹配(如'张%')可走B+树索引,%开头则无法使用;全文索引支持自然语言搜索与相关性排序;必须参数化防SQL注入。
MySQL 模糊查询是实现搜索功能最常用的方式,核心在于 LIKE 和 REGEXP(或 RLIKE),配合合适的索引与参数处理,能兼顾性能与灵活性。
适用于简单关键词搜索,如商品名、用户昵称等。注意区分大小写(取决于字段排序规则,如 utf8mb4_unicode_ci 不区分,utf8mb4_bin 区分)。
WHERE name LIKE '%手机%' 匹配“智能手机”“二手手机壳”WHERE code LIKE 'A_2025' 匹配“A12025”“AZ2025”,但不匹配“A112025”LIKE '%关键词' 无法使用常规 B+ 树索引,建议结合全文索引或前置标准化(如倒排)优化当搜索常以某固定前缀开始时(如查“张*”姓用户),可利用索引加速:
ALTER TABLE users ADD INDEX idx_name (name);
LIKE '张%' 类前缀查询生效;LIKE '%张%' 仍全表扫描ADD INDEX idx_title_prefix (title(50)),适合标题/摘要类字段适合文章内容、评论等长文本搜索,支持分词、相关性排序,比 LIKE 更智能:
FULLTEXT(title, content)
SELECT *, MATCH(title, content) AGAINST('数据库优化' IN NATURAL LANGUAGE MODE) AS score FROM articles WHERE MATCH(title, content) AGAINST('数据库优化' IN NATURAL LANGUAGE MODE) ORDER BY score DESC;
用户输入直接拼接 SQL 是高危操作,必须预处理:
$stmt = $pdo->prepare("SELECT * FROM products WHERE name LIKE CONCAT('%', ?, '%')"); $stmt->execute([$keyword]);
String sql = "SELECT * FROM users WHERE nickname LIKE ?"; ps.setString(1, "%" + keyword + "%");
LIKE '%%' 全表扫不复杂但容易忽略:模糊搜索不是万能方案,数据量大时需结合 Elasti
