博客
关于我
Mysql模糊查询like效率,以及更高效的写法
阅读量:338 次
发布时间:2019-03-04

本文共 1385 字,大约阅读时间需要 4 分钟。

在使用MySQL进行模糊查询时,LIKE语句是最常用的工具。然而,当数据量达到百万级甚至更高时,传统的LIKE查询可能会显著影响查询效率。这时候,我们需要了解如何优化模糊查询,以提升性能。

传统的LIKE查询通常写法为:

SELECT `column` FROM `table` WHERE `field` LIKE '%keyword%';

这种方法在数据库中执行时,会对整个字段进行全表扫描,即使字段上有索引也会被忽略,显著降低了查询效率。

相比之下,优化后的LIKE写法:

SELECT `column` FROM `table` WHERE `field` LIKE 'keyword%';

这种写法能够充分利用索引,显著提升查询速度。然而,这种方法仅适用于关键词位于字段末尾的情况。

当关键词不一定位于字段开头或结尾时,传统的LIKE查询显然不够高效。这时候,我们可以考虑以下几种替代方法:

1. 使用LOCATE(‘substr’, str)方法

LOCATE函数可以帮助我们找到特定子字符串在字段中的位置。例如:

SELECT LOCATE('xbar', `foobar`);  ### 返回0SELECT LOCATE('bar', `foobarbar`); ### 返回4SELECT LOCATE('bar', `foobarbar`, 5); ### 返回7

如果LOCATE返回值大于0,说明字段中存在指定的子字符串。因此,我们可以将查询改写为:

SELECT `column` FROM `table` WHERE LOCATE('keyword', `field`) > 0;

这种方法非常高效,尤其是在字段上建立了索引的情况下。

2. 使用POSITION(‘substr’ IN field)方法

POSITION函数与LOCATE功能相似,主要区别在于返回值表示子字符串在字段中的起始位置。例如:

SELECT `column` FROM `table` WHERE POSITION('keyword' IN `field`);

返回值大于0时,表示字段中存在指定的子字符串。

3. 使用INSTR(str, ‘substr’)方法

INSTR函数可以返回字符串中第一次出现指定子字符串的位置。例如:

SELECT `column` FROM `table` WHERE INSTR(`field`, 'keyword') > 0;

这种方法同样能够高效地筛选出包含关键词的记录。

4. 使用FIND_IN_SET函数

FIND_IN_SET函数返回字符串中指定子字符串的位置,前提是字符串以逗号分隔。例如:

SELECT * FROM `person` WHERE FIND_IN_SET('apply', `name`);

这种方法适用于多个关键词的情况,但需要确保字段中的值是以逗号分隔的格式存储。

优化方法的选择依据

选择哪种方法取决于具体的业务需求和数据结构。例如:

  • 如果关键词通常位于字段的开头或结尾,传统的LIKE查询加上索引可能已经足够。
  • 如果关键词的位置不固定,且字段中包含多个关键词,FIND_IN_SET方法可能更适合。

总之,在实际应用中,应该根据具体需求选择最合适的模糊查询优化方法,以确保既高效又可读。

转载地址:http://qhqe.baihongyu.com/

你可能感兴趣的文章
Python 使jupyter notebook 从指定浏览器启动 以及编程中途更换浏览器
查看>>
设计模式之组合模式
查看>>
(恋上数据结构笔记):优先级队列(Priority Queue)
查看>>
(Python学习笔记):字典
查看>>
(C++11/14/17学习笔记):并发基本概念及实现,进程、线程基本概念
查看>>
(C++11/14/17学习笔记):线程启动、结束,创建线程多法、join,detach
查看>>
(音视频学习笔记):SDL-YUV显示-播放音频PCM
查看>>
leetcode 14 最长公共前缀
查看>>
做做Java
查看>>
2020-2021新技术讲座课程
查看>>
shell中的数学运算
查看>>
如何使用4G模块通过MQTT协议传输温湿度数据到onenet
查看>>
map的find函数和count函数
查看>>
C++并发与多线程(一)
查看>>
C++ 并发与多线程(五)
查看>>
7628 EDCCA认证寄存器修改(认证自适应)
查看>>
C#四行代码写简易计算器,超详细带注释(建议新手看)
查看>>
计算机网络子网划分错题集
查看>>
java一些基本程序
查看>>
数据结构经典十套卷之八
查看>>