扣丁书屋

MySQL使用内置函数来进行模糊搜索(locate()等)

like语句做前后模糊匹配(`%text%`)时,速度慢并且不能使用索引,本文提供以下方案。

常用的一共有4个方法,如下:

1. 使用locate()方法

1.1.普通用法:

SELECT `column` from `table` where locate('keyword', `condition`)>0

类似于 java 的 indexOf();不过 locate() 只要找到返回的结果都大于0(即使是查询的内容就是最开始部分),没有查找到才返回0;

1.2. 指定其实位置:

SELECT LOCATE('bar', 'foobarbar',5);  --> 7 (从foobarbar的第五个位置开始查找)

2.使用instr()函数 (据说是locate()的别名函数)

SELECT `column` from `table` where instr(`condition`, ‘keyword’ )>0

唯一不同的是 查询内容的位置不同,见SQL语句中过的keyword

3.使用position()方法,(据说也是locate()方法的别名函数,功能一样)

SELECT `column` from `table` where position(‘keyword’ IN `condition`)

不过它不再是通过返回值来判断,而是使用关键字 in

4.使用find_in_set()函数

如: find_in_set(str,strlist),strlist必须要是以逗号分隔的字符串

如果字符串str是在的strlist组成的N子串的字符串列表,返回值的范围为1到N

SQL> SELECT FIND_IN_SET('b','a,b,c,d');
+---------------------------------------------------------+
| SELECT FIND_IN_SET('b','a,b,c,d')                       |
+---------------------------------------------------------+
| 2                                                       |
+---------------------------------------------------------+
1 row in set (0.00 sec) 

总结: locate、position 和 instr 的差別只是参数的位置不同,同时locate 多一个起始位置的参数外,两者是一样的。

find_in_set()是个比较特殊的存在,但它们都是返回要查找的子字符串 在 指定字符串中的位置。

速度上前3个比用 like 稍快了一点。(不过这四个函数都不能使用索引,这是个遗憾)

最多阅读

Redis面试题(2020最新版) 2年以前  |  1888次阅读
Ubuntu16.04升级openssl到1.1.1 2年以前  |  1767次阅读
MySQL数据库面试题(2020最新版) 2年以前  |  1660次阅读
今日头条技术架构到底有多牛? 2年以前  |  1518次阅读
docker 访问宿主机网络 2年以前  |  1482次阅读
Kafka 设计详解之网络通信 2年以前  |  1251次阅读
面向数据科学家的 Docker 最佳实践 2年以前  |  1240次阅读
两万字深度介绍分布式系统原理! 2年以前  |  1165次阅读
饿了么交易系统 5 年演化史 2年以前  |  1137次阅读
CentOS 开机流程详解 2年以前  |  1136次阅读
微信支付跨平台软件架构 2年以前  |  1116次阅读
Redis面试题(2020最新版) 2年以前  |  1105次阅读
nginx处理跨域 2年以前  |  1068次阅读
API 网关从入门到放弃 2年以前  |  1049次阅读

手机扫码阅读