在业务开发中,经常需要根据用户输入的关键字去检索数据库记录,这种需求通常通过SQL模糊查询来实现。最常用的是LIKE操作符,而在部分数据库如MySQL、PostgreSQL中也支持使用正则函数做更复杂的模式匹配。理解它们的写法与性能差异,对系统设计很重要。

一、LIKE的基本写法
LIKE用于匹配字符串模式,配合通配符百分号%和下划线_使用。下面是几个常见示例:
-- 前缀匹配:查找以张开头的姓名 SELECT * FROM user WHERE name LIKE '张%'; -- 中间匹配:查找包含明的姓名 SELECT * FROM user WHERE name LIKE '%明%'; -- 后缀匹配:查找以伟结尾的姓名 SELECT * FROM user WHERE name LIKE '%伟'; -- 单字符匹配:查找第二个字为小的姓名 SELECT * FROM user WHERE name LIKE '_小%';
二、正则匹配的写法
一些数据库提供正则函数,例如MySQL的REGEXP或PostgreSQL的~操作符,可以表达更复杂的规则。
-- MySQL中使用正则匹配手机号格式
SELECT * FROM user WHERE phone REGEXP '^1[3-9][0-9]{9}$';
-- PostgreSQL中使用~做正则匹配
SELECT * FROM log WHERE path ~ '^/api/v[12]/';
三、LIKE与正则性能对比
两者的核心差异体现在索引利用和执行开销上,下面用表格说明常见场景。
| 查询类型 | LIKE能否走索引 | 正则能否走索引 | 说明 |
|---|---|---|---|
| 前缀匹配('abc%') | 能,使用B树索引 | 通常不能 | 前缀明确时可快速定位 |
| 中间或后缀匹配('%abc') | 不能,全表扫描 | 不能 | 两者均需遍历数据 |
| 复杂模式(如邮箱规则) | 难以表达 | 能表达但慢 | 正则更灵活但CPU开销大 |
1. 前缀匹配效率最高
当使用LIKE '前缀%'时,如果字段上有B树索引,数据库可以像范围查询一样快速缩小扫描区间。而正则无论模式如何,大多数数据库优化器无法将其转换为索引范围扫描。
2. 非前缀场景两者接近
对于%关键字%这类写法,LIKE和正则都只能全表扫描。此时LIKE的实现更轻量,正则因需要编译和执行状态机,CPU消耗通常更高。
3. 复杂规则优先考虑应用层
如果模式非常复杂,建议把数据取出后在应用代码里过滤,或者借助全文索引、专用搜索引擎,而不是在SQL里写重正则。
四、实践建议
- 简单包含查询优先用LIKE,并注意尽量写成前缀匹配。
- 必须做格式校验类匹配时,可用正则,但要避免对大表高频调用。
- 超大数据量模糊搜索应使用倒排索引或Elasticsearch。
总结:LIKE在绝大多数模糊查询中性能更好且易用,正则胜在表达力强,但代价是执行效率。选型时应以实际查询模式和数据集大小为依据。