在日常业务开发中,字符串模糊匹配是地址检索、名称筛选等场景的高频需求。在达梦数据库中,LIKE 操作符与 INSTR 字符串定位函数是最常用的两种模糊匹配方案。很多人都会纠结:两者到底谁的效率更高?索引对它们的性能影响有多大?
我将基于1000 万条真实模拟的业务数据,来进行测试。
首先我创建了模拟业务的 users 用户表,包含姓名、性别、身份证号、地址 4 个核心字段,总数据量 1000 万条,所有字段均为非空填充,完全贴合真实业务场景:
测试用例设计:
1、全模糊匹配:LIKE '%关键词%',匹配字段任意位置包含目标字符串
2、函数匹配:INSTR(字段, 关键词) > 0,与全模糊匹配语义完全等价
3、前缀模糊匹配:LIKE '关键词%',匹配字段以目标字符串开头的记录,验证索引的优化效果
1、全模糊匹配 LIKE '%湖北省武汉市%'
测试结果:
执行耗时 1.244 秒,执行计划为全表扫描。
2、INSTR 函数匹配 INSTR(DZ, '湖北省武汉市') > 0
测试结果:
执行耗时 0.724 秒,执行计划同样为全表扫描,但耗时较全模糊LIKE降低了约 33%。
两者均为全表扫描,性能差异的核心在于底层执行的 CPU 开销不同:
LIKE '%xxx%' 需要对每一行字符串做通配符模式匹配,包含通配符解析、正则回溯等额外开销,长字符串场景下性能损耗更明显;
INSTR 是专用的子串定位函数,采用更高效的子串匹配算法(如 KMP),无通配符解析开销,找到子串首次出现的位置即可返回结果,无需全串回溯匹配,CPU 执行效率更高。
3、为地址dz添加索引,使用前缀模糊匹配 LIKE '湖北省武汉市%'
测试结果:
执行耗时 0.001 秒(1 毫秒),较全表扫描场景性能提升上千倍,执行计划为索引范围扫描。
LIKE 'xxx%' 是前缀匹配,完全符合 B 树索引的有序排序规则。达梦数据库可以直接通过idx_users_dz索引,快速定位到以湖北省武汉市开头的索引条目范围,无需扫描全表,甚至可以直接通过索引统计信息快速得到count结果,因此耗时直接降到了毫秒级。
LIKE 语法适用于前缀模糊查询场景,这是 LIKE 的绝对优势,LIKE '前缀%'完全符合 B 树索引的左前缀匹配规则,可直接走索引范围扫描。INSTR 函数适用于千万级数据量甚至更大数据量的场景,性能远超LIKE '%关键词%'写法。当两种语法查询速度相同时,更推荐使用LIKE语法,LIKE语法的可读性更高。
文章
阅读量
获赞
