mysql如何让左模糊查询也能走索引
作者:绅士jiejie 发布时间:2024-01-16 09:20:32
让左模糊查询也能走索引
测试表USER_INFO表数据以及结构如下
有一个USER_NAME字段的索引
有个业务需求,需要模糊搜索出用户名后几位有杰这个词的所有用户信息,这时候不可能说为了一个搜索就引入ES,但是如果sql使用左模糊查询的话,根据索引的最左匹配原则,该sql语句是不可能使用到idx_user_name索引的,如下:
EXPLAIN SELECT * from USER_INFO where USER_NAME like '%杰'
执行计划如下:
可以发现是用不到索引的。
需要做模糊匹配,又要用到索引,索引的最左匹配原则更是不能被打破,这时候可以增加一个字段,这个字段的内容等于USER_NAME字段内容的反转,同时加上这个字段的相关索引,如下:
此时如果是要模糊搜索出用户名后几位有杰这个词的所有用户信息,可以对REVERSE_USER_NAME字段做右模糊查询,效果其实就是和对USER_NAME字段做左模糊查询是一样的,因为二者的内容是相反的,结果如下:
SELECT * from USER_INFO where REVERSE_USER_NAME like '杰%'
执行计划如下:
小结一下:索引的最左匹配原则不能打破,那么要让左匹配也走索引的话,换个思路,让右匹配的效果和左匹配一样就好了,同时右匹配又能走索引,间接达到了左模糊查询也能走索引的目的。
模糊查询(like、instr)
SQL中经常会遇到模糊查询,现在模糊查询正常、最常用的有两种,一种是like、另一种是instr,这两种单单是简单的搜索,instr的效率是比like要高的(这也得看%在哪儿了)。
1. like
like中分右模糊、左模糊,右模糊比如’abc%‘时,扫描索引,高效。当模糊查询含左模糊时,比如’%abc’,进行全表扫描,低效。当然更别提’%abc%'了。
2. instr
instr(字段名, string),instr的使用也很简单,就是填写一下字段名,然后与后面需要查找的内容相关。这个比like的左模糊效率要高,但是要比右模糊还是相差不多的(因为在instr不分左右模糊)。
3. A>=’’ and A<’’
今天在搜索查找之时还找到了这么一个查找方法,这个方法要比上面的instr效率还要高,不过这个方法局限性还是比较高的。例如:
select * from formtable_main_200_dt1 where hth >= '16040610' and hth < '16040611'
这个方法只适用于字符型字段,且除了我们想要的字段外,还得加上一个超过此类型的,并且他只支持右模糊。但是在这几个当中就右模糊而言,他的效率是最高的。
3的补充讲解
在数据中进行字符的比较时发现自己并不是对此了解,这里记下这里字符的比较是比较的哪里。
这里的比较是比较的ASCII,但这不是比较的总的ASCII,而是一个字符一个字符的比较,例如我这里有数据库的字段为’123456123’,而要比较的还有’123456223’,这里进行比较,当到了61的1和62的2时就可以比较出大小了。
来源:https://genjiejie.blog.csdn.net/article/details/106583450
猜你喜欢
- 字典的创建名称={”键名“:”键值“}举例:person={
- 这篇文章主要介绍了IOS苹果AppStore内购付款的服务器端php验证方法(使用thinkphp)。AppStore内购在app中支付的过
- islower()方法判断检查字符串的所有的字符(字母)是否为小写。语法以下是islower()方法的语法:str.islowe
- 本文实例讲述了Python基于dom操作xml数据的方法。分享给大家供大家参考,具体如下:1、xml的内容为del.xml,如下<?x
- Sql代码 CREATE TABLE test(a VARCHAR2( 20),b VARCHAR2 (20),c NUMBER,d VAR
- 用Pdb调试有多种方式使用 Pdb调试 Python的程序的方式主要是下面的三种!下面逐一介绍命令行加-m参数命令行启动目标程序,加上-m参
- 在document.form1.submit();后加document.body.innerHtml = "W
- 1.在pycharm下安装scrapy函数库2.将安装好scrapy函数库下的路径配置到系统path的环境变量中3.打开cmd终端输入:sc
- 昨时要导一些数据,从网上搜到的。字段多时insert 语句生成的不完整了,还没有找到原因..有个缺点……就是标识种子的列 也insert了c
- jinja2简介特征沙箱中执行强大的 HTML 自动转义系统保护系统免受 XSS模板继承及时编译最优的 python 代码可选提前编译模板的
- YOLO是You-Only-Look-Once的缩写,它无疑是根据COCO数据集训练的最好的对象检测器之一。YOLOv4是最新的迭代版本,它
- 使用matplotlib中的一些函数将tensorflow中的数据可视化,更加便于分析import tensorflow as tfimpo
- 在cssrain整理的一个 试题集 中有这么一道题:<SCRIPT LANGUAGE="JavaScript"&g
- 1、MSSQL2000 SELECT 表名 = case when a.colorder=1 then d.name else '&
- 本文实例讲述了Python利用神经网络解决非线性回归问题。分享给大家供大家参考,具体如下:问题描述现在我们通常使用神经网络进行分类,但是有时
- 前言生成器generator生成器的本质是一个迭代器(iterator)要理解生成器,就要在理解一下迭代,可迭代对象,迭代器,这三个概念Py
- Rel-License 是微格式的开发标准之一,简单的说就是通过给引用标签(通常是链接)加上REL属性,来标明所引用链接/数据与文章的关系。
- 本文接上一篇博客python实现的八大排序算法part1,将继续使用python实现八大排序算法中的剩余四个:快速排序、堆排序、归并排序、基
- 一、查看event是否开启show variables like '%sche%'; set global ev
- 一、日志级别1. 级别定义logging模块提供了5种日志级别,分别为:CRITICAL>ERROR>WARNING>IN