MySQL高效模糊搜索之内置函数locate instr position find_in_set使用详解

 更新时间:2018年09月26日 14:57:39   投稿:wdc  
在MySQL中一般进行模糊搜索都是使用LIKE配合通配符进行查询的,在性能上一定的影响,下面给大家分享MYSQL自带的内置模糊搜索函数,除最后一个外其它三个性能上要比Like快些

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

1.使用locate()方法

普通用法:

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

类似于java的indexOf();

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

指定起始位置:

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

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

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

唯一不同的是查询内容的位置不同

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>SELECTFIND_IN_SET('b','a,b,c,d');
---------------------------------------------------------+
|SELECTFIND_IN_SET('b','a,b,c,d')|
---------------------------------------------------------+
|2|
---------------------------------------------------------+
1rowinset(0.00sec)

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

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

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

下面为再为大家介绍一下Mysql中Like的使用方法

MySQL的like语句中的通配符:百分号、下划线和escape

%:表示任意个或多个字符。可匹配任意类型和长度的字符。

Sql代码

select * from user where username like '%huxiao'; 

select * from user where username like 'huxiao%'; 

select * from user where username like '%huxiao%';

另外,如果需要找出u_name中既有“三”又有“猫”的记录,请使用and条件

SELECT * FROM [user] WHERE u_name LIKE ‘%三%' AND u_name LIKE ‘%猫%'

若使用 SELECT * FROM [user] WHERE u_name LIKE ‘%三%猫%'

虽然能搜索出“三脚猫”,但不能搜索出符合条件的“张猫三”。

_:表示任意单个字符。匹配单个任意字符,它常用来限制表达式的字符长度语句:(可以代表一个中文字符)
 

Sql代码  

select * from user where username like '_'; 

select * from user where username like 'huxia_'; 

select * from user where username like 'h_xiao'; 

 如果我就真的要查%或者_,怎么办呢?使用escape,转义字符后面的%或_就不作为通配符了,注意前面没有转义字符的%和_仍然起通配符作用

Sql代码  

select username from gg_user where username like '%xiao/_%' escape '/';

select username from gg_user where username like '%xiao/%%' escape '/';

MySQL 通配符

SQL的模式匹配允许你使用“_”匹配任何单个字符,而“%”匹配任意数目字符(包括零个字符)。在 MySQL中,SQL的模式缺省是忽略大小写的。下面显示一些例子。

注意在你使用SQL模式时,你不能使用=或!=;而使用LIKE或NOT LIKE比较操作符。

为了找出以“b”开头的名字:

mysql> SELECT * FROM pet WHERE name LIKE "b%";
+--------+--------+---------+------+------------+------------+
| name | owner | species | sex | birth | death |
+--------+--------+---------+------+------------+------------+
| Buffy | Harold | dog | f | 1989-05-13 | NULL |
| Bowser | Diane | dog | m | 1989-08-31 | 1995-07-29 |
+--------+--------+---------+------+------------+------------+

为了找出以“fy”结尾的名字:

mysql> SELECT * FROM pet WHERE name LIKE "%fy";
+--------+--------+---------+------+------------+-------+
| name | owner | species | sex | birth | death |
+--------+--------+---------+------+------------+-------+
| Fluffy | Harold | cat | f | 1993-02-04 | NULL |
| Buffy | Harold | dog | f | 1989-05-13 | NULL |
+--------+--------+---------+------+------------+-------+

为了找出包含一个“w”的名字:

mysql> SELECT * FROM pet WHERE name LIKE "%w%";
+----------+-------+---------+------+------------+------------+
| name | owner | species | sex | birth | death |
+----------+-------+---------+------+------------+------------+
| Claws | Gwen | cat | m | 1994-03-17 | NULL |
| Bowser | Diane | dog | m | 1989-08-31 | 1995-07-29 |
| Whistler | Gwen | bird | NULL | 1997-12-09 | NULL |
+----------+-------+---------+------+------------+------------+

为了找出包含正好5个字符的名字,使用“_”模式字符:

mysql> SELECT * FROM pet WHERE name LIKE "_____";
+-------+--------+---------+------+------------+-------+
| name | owner | species | sex | birth | death |
+-------+--------+---------+------+------------+-------+
| Claws | Gwen | cat | m | 1994-03-17 | NULL |
| Buffy | Harold | dog | f | 1989-05-13 | NULL |
+-------+--------+---------+------+------------+-------+

由MySQL提供的模式匹配的其他类型是使用扩展正则表达式。当你对这类模式进行匹配测试时,使用REGEXP和NOT REGEXP操作符(或RLIKE和NOT RLIKE,它们是同义词)。

扩展正则表达式的一些字符是:

“.”匹配任何单个的字符。

一个字符类“[...]”匹配在方括号内的任何字符。

例如,“[abc]”匹配“a”、“b”或“c”。为了命名字符的一个范围,使用一个“-”。“[a-z]” 匹配任何小写字母,而“[0-9]”匹配任何数字。

“ * ”匹配零个或多个在它前面的东西。

例如,“x*”匹配任何数量的“x”字符,“[0-9]*”匹配的任何数量的数字,而“.*”匹配任何数量的任何东西。

正则表达式是区分大小写的,但是如果你希望,你能使用一个字符类匹配两种写法。

例如,“[aA]”匹配小写或大写的“a”而“[a-zA-Z]”匹配两种写法的任何字母。

如果它出现在被测试值的任何地方,模式就匹配(只要他们匹配整个值,SQL模式匹配)。

为了定位一个模式以便它必须匹配被测试值的开始或结尾,在模式开始处使用“^”或在模式的结尾用“$”。

为了说明扩展正则表达式如何工作,上面所示的LIKE查询在下面使用REGEXP重写:

为了找出以“b”开头的名字,使用“^”匹配名字的开始并且“[bB]”匹配小写或大写的“b”:

mysql> SELECT * FROM pet WHERE name REGEXP "^[bB]";
+--------+--------+---------+------+------------+------------+
| name | owner | species | sex | birth | death |
+--------+--------+---------+------+------------+------------+
| Buffy | Harold | dog | f | 1989-05-13 | NULL |
| Bowser | Diane | dog | m | 1989-08-31 | 1995-07-29 |
+--------+--------+---------+------+------------+------------+

为了找出以“fy”结尾的名字,使用“$”匹配名字的结尾:

mysql> SELECT * FROM pet WHERE name REGEXP "fy$";
+--------+--------+---------+------+------------+-------+
| name | owner | species | sex | birth | death |
+--------+--------+---------+------+------------+-------+
| Fluffy | Harold | cat | f | 1993-02-04 | NULL |
| Buffy | Harold | dog | f | 1989-05-13 | NULL |
+--------+--------+---------+------+------------+-------+

为了找出包含一个“w”的名字,使用“[wW]”匹配小写或大写的“w”:

mysql> SELECT * FROM pet WHERE name REGEXP "[wW]";
+----------+-------+---------+------+------------+------------+
| name | owner | species | sex | birth | death |
+----------+-------+---------+------+------------+------------+
| Claws | Gwen | cat | m | 1994-03-17 | NULL |
| Bowser | Diane | dog | m | 1989-08-31 | 1995-07-29 |
| Whistler | Gwen | bird | NULL | 1997-12-09 | NULL |
+----------+-------+---------+------+------------+------------+

既然如果一个正规表达式出现在值的任何地方,其模式匹配了,就不必再先前的查询中在模式的两方面放置一个通配符以使得它匹配整个值,就像如果你使用了一个SQL模式那样。

 为了找出包含正好5个字符的名字,使用“^”和“$”匹配名字的开始和结尾,和5个“.”实例在两者之间:

mysql> SELECT * FROM pet WHERE name REGEXP "^.....$";
+-------+--------+---------+------+------------+-------+
| name | owner | species | sex | birth | death |
+-------+--------+---------+------+------------+-------+
| Claws | Gwen | cat | m | 1994-03-17 | NULL |
| Buffy | Harold | dog | f | 1989-05-13 | NULL |
+-------+--------+---------+------+------------+-------+

你也可以使用“{n}”“重复n次”操作符重写先前的查询:

mysql> SELECT * FROM pet WHERE name REGEXP "^.{5}$";
+-------+--------+---------+------+------------+-------+
| name | owner | species | sex | birth | death |
+-------+--------+---------+------+------------+-------+
| Claws | Gwen | cat | m | 1994-03-17 | NULL |
| Buffy | Harold | dog | f | 1989-05-13 | NULL |
+-------+--------+---------+------+------------+-------+

以上是Mysql模糊搜索方法Like的使用方法,与前locate instr position这三个内置函数相比性能上要慢些,无论哪种模糊搜索在查询时都会消耗大量服务器资源所以在实际工作中我们应尽量少用模糊搜索

相关文章

  • 使用MySQL唯一索引的注意事项及说明

    使用MySQL唯一索引的注意事项及说明

    这篇文章主要介绍了使用MySQL唯一索引的注意事项及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-12-12
  • mysql 单机数据库优化的一些实践

    mysql 单机数据库优化的一些实践

    这篇文章主要介绍了mysql 单机数据库优化的一些实践的相关资料,需要的朋友可以参考下
    2016-09-09
  • 介绍一个针对C++程序的MySQL访问库soci

    介绍一个针对C++程序的MySQL访问库soci

    这篇文章主要介绍了介绍一个针对C++程序的MySQL访问库soci,文章中还讲了其中的一些操作方法,需要的朋友可以参考下
    2015-05-05
  • MySQL Community Server 8.0.29安装配置方法图文教程

    MySQL Community Server 8.0.29安装配置方法图文教程

    这篇文章主要为大家详细介绍了MySQL Community Server 8.0.29安装配置方法图文教程,文中安装步骤介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-06-06
  • 一键清空(重置)本地MySQL8.0密码脚本

    一键清空(重置)本地MySQL8.0密码脚本

    这篇文章主要介绍了一键清空本地MySQL8.0密码脚本,再也不用担心MySQL密码忘记了,很容易的解决了忘记mysql密码的烦恼,操作方法也非常简单,需要的朋友可以参考下
    2023-01-01
  • MySQL创建数据库和创建数据表的操作过程

    MySQL创建数据库和创建数据表的操作过程

    MySQL 是最常用的数据库,在数据库操作中,基本都是增删改查操作,简称CRUD,这篇文章主要介绍了MySQL创建数据库和创建数据表的操作过程,需要的朋友可以参考下
    2022-11-11
  • mysql 中存在null和空时创建唯一索引的方法

    mysql 中存在null和空时创建唯一索引的方法

    据库默认值都有null,此时创建唯一索引时要注意了,此时数据库会把空作为多个重复值
    2014-10-10
  • MySQL中binlog备份脚本的方法

    MySQL中binlog备份脚本的方法

    这篇文章主要介绍了MySQL中binlog备份脚本分享,这里主要介绍一下我写的MySQL二进制日志的备份脚本,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-04-04
  • MySQL约束超详解

    MySQL约束超详解

    这篇文章主要介绍了MySQL约束包括非空约束、唯一约束、主键约束、外键约束,需要的朋友可以具体参考下面文章内容
    2021-09-09
  • MYSQL数据库GTID实现主从复制实现(超级方便)

    MYSQL数据库GTID实现主从复制实现(超级方便)

    这篇文章主要介绍了MYSQL数据库GTID实现主从复制实现(超级方便),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-11-11

最新评论