我的编程空间,编程开发者的网络收藏夹
学习永远不晚

MySQL中LIKE BINARY和LIKE模糊查询实例代码

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

MySQL中LIKE BINARY和LIKE模糊查询实例代码

1. Django ORM id__startswith 查询变慢

问题

项目接口请求耗时,3-4s

原因

随着数据库表数据的增加,原先的 ORM 查询速度变慢

解决

排查到 sql 查询语句使用的模糊查询是区分大小的,导致查询效率变慢,模糊匹配的字符不存在大小写敏感,修改模糊匹配为大小写不敏感

优化前

Django ORM DQL

# ORM 示例 ( startswith == like binary)
XXXmodel.objects.filter(
        region_id__startswith=region_id[:3],
        nic_id__in=nic_code_list
        ).values('nic_id').annotate(Sum('amount'))

mysql 原生 DQL

# LIKE BINARY 区分大小写
SELECT `leader_vt_patent`.`nic_id`, SUM(`leader_vt_patent`.`amount`) AS `amount__sum` FROM `leader_vt_patent` WHERE (`leader_vt_patent`.`nic_id` IN ('C13', 'C14', 'C15', 'C16', 'C17', 'C18', 'C19', 'C20', 'C21', 'C22', 'C23', 'C24', 'C25', 'C26', 'C27', 'C28', 'C29', 'C30', 'C31', 'C32', 'C33', 'C34', 'C35', 'C36', 'C37', 'C38', 'C39', 'C40', 'C41', 'C42', 'C43') AND `leader_vt_patent`.`region_id` LIKE BINARY '110%') GROUP BY `leader_vt_patent`.`nic_id`, `leader_vt_patent`.`tyear` ORDER BY `leader_vt_patent`.`tyear` DESC;

MySQL中LIKE BINARY和LIKE模糊查询实例代码

耗时 1.16s

优化后

Django ORM DQL

# ORM 示例 ( istartswith == like )
XXXmodel.objects.filter(
        region_id__istartswith=region_id[:3],
        nic_id__in=nic_code_list
        ).values('nic_id').annotate(Sum('amount'))

mysql 原生 DQL

# LIKE 不区分大小写
SELECT `leader_vt_patent`.`nic_id`, SUM(`leader_vt_patent`.`amount`) AS `amount__sum` FROM `leader_vt_patent` WHERE (`leader_vt_patent`.`nic_id` IN ('C13', 'C14', 'C15', 'C16', 'C17', 'C18', 'C19', 'C20', 'C21', 'C22', 'C23', 'C24', 'C25', 'C26', 'C27', 'C28', 'C29', 'C30', 'C31', 'C32', 'C33', 'C34', 'C35', 'C36', 'C37', 'C38', 'C39', 'C40', 'C41', 'C42', 'C43') AND `leader_vt_patent`.`region_id` LIKE '110%') GROUP BY `leader_vt_patent`.`nic_id`, `leader_vt_patent`.`tyear` ORDER BY `leader_vt_patent`.`tyear` DESC;

MySQL中LIKE BINARY和LIKE模糊查询实例代码

耗时 0.27s

2. MySQL 模糊匹配

简介

MySQL 模糊搜索:

LIKE BINARY 是区分大小写的

LIKE 是否区分大小写,取决于表的 COLLATE,如果 COLLATE=utf8_bin 即二进制形式就是区分大小写的, 否则是不区分的

ORM 写法

xxx.objects.filter(namecontains=‘sxn’)xxx.objects.filter(name__icontains=‘sxn’)

SQL 写法

LIKE BINARYLIKE

用法

LIKE 关键字支持百分号**“ %”** 和下划线 “_” 通配符

通配符是一种特殊语句,主要用来模糊查询。当不知道真正字符或者懒得输入完整名称时,可以使用通配符来代替一个或多个真正的字符。

带有 “%” 通配符的查询

“%”MySQL 中最常用的通配符,它能代表任何长度的字符串,字符串的长度可以为 0。例如,a%b 表示以字母 a 开头,以字母 b 结尾的任意长度的字符串。该字符串可以代表 ab、acb、accb、accrb 等字符串。

例 1

tb_students_info 表中,查找所有以字母 “T” 开头的学生姓名,SQL 语句和运行结果如下。

mysql> SELECT name FROM tb_students_info
    -> WHERE name LIKE 'T%';
+--------+
| name   |
+--------+
| Thomas |
| Tom    |
+--------+
2 rows in set (0.12 sec)

可以看到,查询结果中只返回了以字母 “T” 开头的学生姓名。

注意:匹配的字符串必须加单引号或双引号。

NOT LIKE 表示字符串不匹配时满足条件。

例 2

tb_students_info 表中,查找所有不以字母 “T” 开头的学生姓名,SQL 语句和运行结果如下。

mysql> SELECT NAME FROM tb_students_info
    -> WHERE NAME NOT LIKE 'T%';
+-------+
| NAME  |
+-------+
| Dany  |
| Green |
| Henry |
| Jane  |
| Jim   |
| John  |
| Lily  |
| Susan |
+-------+
8 rows in set (0.00 sec)

可以看到,查询结果中返回了不以字母 “T” 开头的学生姓名。

例 3

tb_students_info 表中,查找所有包含字母 “e” 的学生姓名,SQL 语句和运行结果如下。

mysql> SELECT name FROM tb_students_info
    -> WHERE name LIKE '%e%';
+-------+
| name  |
+-------+
| Green |
| Henry |
| Jane  |
+-------+
3 rows in set (0.00 sec)

可以看到,查询结果中返回了所有包含字母 “e” 的学生姓名。

带有“_”通配符的查询

“_” 只能代表单个字符,字符的长度不能为 0。例如,a_b 可以代表 acb、adb、aub 等字符串。

例 1

tb_students_info 表中,查找所有以字母 “y” 结尾,且 “y” 前面只有 4 个字母的学生姓名,SQL 语句和运行结果如下。

mysql> SELECT name FROM tb_students_info
    -> WHERE name LIKE '____y';
+-------+
| name  |
+-------+
| Henry |
+-------+
1 row in set (0.00 sec)

LIKE 区分大小写

默认情况下,LIKE 关键字匹配字符的时候是不区分大小写的。如果需要区分大小写,可以加入 BINARY 关键字。

例 1

tb_students_info 表中,查找所有以字母 “t” 开头的学生姓名,区分大小写和不区分大小写的 SQL 语句和运行结果如下。

mysql> SELECT name FROM tb_students_info WHERE name LIKE 't%';
+--------+
| name   |
+--------+
| Thomas |
| Tom    |
+--------+
2 rows in set (0.00 sec)

mysql> SELECT name FROM tb_students_info WHERE name LIKE BINARY 't%';
Empty set (0.01 sec)

由结果可以看到,区分大小写后,“Tom”“Thomas” 等记录就不会被匹配到了。

使用通配符的注意事项和技巧

  • 注意大小写
    • MySQL 默认是不区分大小写的,如果区分大小写,像 “Tom” 这样的数据就不能被 “t%” 所匹配到。
  • 注意尾部空格
    • 尾部空格会干扰通配符的匹配,例如,**“T% ”**就不能匹配到 “Tom”。
  • 注意 NULL
    • “%” 通配符可以到匹配任意字符,但是不能匹配 NULL,也就是说 “%” 匹配不到 tb_students_info 数据表中值为 NULL 的记录。
  • 不要过度使用通配符,如果其它操作符能达到相同的目的,应该使用其它操作符,因为 MySQL 对通配符的处理一般会比其他操作符花费更长的时间。
  • 在确定使用通配符后,除非绝对有必要,否则不要把它们用在字符串的开始处,把通配符置于搜索模式的开始处,搜索起来是最慢的。
  • 仔细注意通配符的位置,如果放错地方,可能不会返回想要的数据。

3. 拓展

如果查询内容中包含通配符,可以使用 “\” 转义符。

例如,在 tb_students_info 表中,将学生姓名 “Dany” 修改为 “Dany%” 后,查询以 “%” 结尾的学生姓名,SQL 语句和运行结果如下:

mysql> SELECT NAME FROM test.`tb_students_info` WHERE NAME LIKE '%\%';
+-------+
| NAME  |
+-------+
| Dany% |
+-------+
1 row in set (0.00 sec)

总结

到此这篇关于MySQL中LIKE BINARY和LIKE模糊查询的文章就介绍到这了,更多相关MySQL LIKE BINARY和LIKE模糊查询内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

MySQL中LIKE BINARY和LIKE模糊查询实例代码

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

MySQL中LIKE BINARY和LIKE模糊查询实例代码

通常在实际应用中,会涉及到模糊查询的需求,下面这篇文章主要给大家介绍了关于MySQL中LIKE BINARY和LIKE模糊查询的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
2022-11-13

MYSQL中LIKE(模糊查询)

文章目录 0 写在前面1 代码格式2 SQL数据准备3 举例3.1格式一:`[NOT] where 字段 LIKE '%' `:表示指代任意内容;3.2 格式四:[NOT] where 字段 LIKE '值1%' `: 4 写在
2023-08-25

mysql中like % %模糊查询的实现

1,%:表示任意0个或多个字符。可匹配任意类型和长度的字符,有些情况下若是中文,请使用两个百分号(%%)表示。 比如 SELECT * FROM [user] WHERE u_name LIKE '%三%'将会把u_name为“张三”,“张
2022-05-27

MySQL不用like+%实现模糊查询

目录一、前言二、倒排索引三、全文检索3.1、创建全文索引3.2、使用全文索引3.3、Natural Language3.4、Boolean3.5、Query Expansion四、删除全文索引4.1、直接删除全文索引语法如下:4.2、使用
2023-01-05

MySQL中Like模糊查询速度太慢该怎么进行优化

这篇文章主要介绍MySQL中Like模糊查询速度太慢该怎么进行优化,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!第一个思路建索引1、like %keyword 索引失效,使用全表扫描。2、like keyword%
2023-06-22

解读Oracle中代替like进行模糊查询的方法instr(更高效)

目录一、简介二、使用说明对应参数描述 我们以一些示例讲解使用方法三、instr()与like比较instr函数也有三种情况下面通过一个示例说明like 与 instr()的使用比较四、效率对比五、总结一、简介相信大家都使用过like进行模
2022-11-18

MySQL全文索引在数据库中的应用和优势(模糊查询不用like+%)

目录前言创建全文索引使用全文索引Natural LanguageBooleanQuery Expansion删除全文索引总结前言我们都知道 InnoDB 在模糊查询数据时使用 "%xx" 会导致索引失效,但有时需求就是如此,类似这样的需求
MySQL全文索引在数据库中的应用和优势(模糊查询不用like+%)
2024-09-08

mybatis中like模糊查询特殊字符报错怎么实现转义处理

这篇文章给大家分享的是有关mybatis中like模糊查询特殊字符报错怎么实现转义处理的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。like模糊查询特殊字符报错转义处理方案1 2023-06-26

MySQL中join查询实例代码分析

这篇“MySQL中join查询实例代码分析”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“MySQL中join查询实例代码分析
2022-11-30

Python模糊查询本地文件夹去除文件后缀的实例(7行代码)

7行代码实现的,废话不多说,直接上代码:import os,redef fuzzy_search(path):word= input('请输入要查询的内容:')for filename in os.listdir(path):  #遍历指定
2022-06-04

Mysql使用concat函数实现关键字模糊查询功能(列表数据过滤含前后端代码)

目录前言页面布局sql编写后端代码接口测试前端代码测试效果总结前言不知道大家在开发中有没有这样的经历:根据条件过滤列表数据项。这种的条件少的还好,比如根据姓名或者性别过滤,这样不仅页面会稍微美观一些,对于sql的压力以及后端的代码量也是
2023-02-14

编程热搜

目录