MySQL中like关键字与索引的使用

严格来说,like '%abc'本身是不能使用索引的,但是一条SQL语句有没有使用索引,要看这条SQL语句整体写的是什么,like不是疫情期间的新冠病毒,沾上一点儿就会把索引隔离开。只要你明白自己在干什么,完全可以使用like。

like的简单说明

like这个查询条件其实用代码很好说明。比如一个查询是select id, name from user,我们把查询的返回的结果放在一个数组里,like 的作用就相当于做了下面的事情:

ret = []
for user in user_list:if user['name'].find(sub_str) != -1:ret.append(user)

like的作用就相当于对前面语句的查询结果遍历了一遍,对结果中的每一项都做了子串匹配。而like 本身没有引入任何索引的机制,就是一个纯粹的字串匹配,一般来说索引(哈希索引)只能使用在严格匹配的场景上。而上面的例子,在数据库实际的处理中,就相当于把这个遍历的过程放到了数据之内而已。

这个时候,我们比较容易就可以想到,如果使用了like,那么查询的效率的主要取决于user_list的大小,也就是在SQL中like 之外的部分结果集合的大小。所以根据这个,我们可以看一下哪些情况可以使用like。

对like的合理使用

首先,如果表的规模很小,比如一共100来个用户,查个名字什么的like随便用。

第二是,配合其他被索引覆盖的查询条件一起用。这个逻辑也特别的简单,既然直接使用like工作量太大,那么先用别的索引把范围缩小,再用like从已经缩小的中间结果里面筛选出最后的结果就可以了。如何缩小范围就和具体的数据有关了,比如可以先用用户的最后登录时间先筛选出最近登陆过的用户,这个登录时间是可以做一个B+树索引的,每次只在这个范围里做like,需要遍历的空间就小多了。当

然这个方法需要通过额外的信息来压缩使用like遍历的范围,如果从需求的层面无法得到这个额外的信息就没办法这么干了。这时我们我们可以开始考虑使用MySQL的全文索引。

全文索引

MySQL全文索引是在比较大规模的数据集合上解决like查询条件性能的最适合的方法。

MySQL建立全文索引的方式是对字段的内容进行分词,然后对每一个词都进行索引,直接的效果就是分词的结果列表中的每一个词都可以被检索到。所以全文索引的效果非常接近于通过like进行查询的效果。使用全文索引的方法很简单,首先对查询的字段建立全文索引

CREATE FULLTEXT INDEX idx_name ON user(name);

然后通过match against来进行查询

SELECT id, name FROM user WHERE MATCH(name) AGAINST('Json');

不过对于中文来说,这还是不够的,因为MySQL默认的分词机制是不支持中文的。这时就可以粗暴的使用2-gram的分词方式,也就是把“这是一句话”分成`"这是","是一","一句","句话" 几个词的分词方式。这么做的话,需要首先把修改MySQL的一个设置,把ngram的token的长度为2

SET GLOBAL ngram_token_size = 2;

然后需要在创建全文索引时指定parser为ngram

CREATE FULLTEXT INDEX idx_name ON user(name) WITH PARSER ngram;

这样就可以开心的用中文的全文索引来查询了。不过因为对查询也会进行分词的原因,所以通过全文索引得到的结果数量会远远比通过like查询得到的结果多。比如查询“我爱我家”,那么name字段中包含了我爱爱我我家的内容都会被返回回来,这是如果想要更为精准的返回匹配“我爱我家”的结果,我们就可以继续使用like了:

SELECT id, name FROM user WHERE MATCH(name) AGAINST('我爱我家') and name like '%我爱我家%';

不要担心,因为这里查询条件中,还有使用全文索引的查询条件来确保索引的使用,而like则只是在使用索引得到的结果中再筛选一次。 既可以得到和like几乎相同的查询效果,又通过索引来提高了查询效率。

总结

使用like进行查询的逻辑其实非常符合我们的直接的认知。就像在bash中使用grep来筛选命令行的结果和like其实是同样的逻辑。只是如果数据库中的数据很多时,我们需要通过其他的方法来缩减直接应用like的范围而已。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/2834.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Maven多模块快速升级超好用Idea插件-MPVP

功能:多模块maven项目快速升级指定版本插件,并提供预览和相关升级模块日志能力。 可快速进行版本升级,进行部署到Maven仓库。 安装: 可在idea插件中心进行安装 / 下载资源拖动安装 MPVP(Maven) - IntelliJ IDEs Plugin | Marke…

html5 语义化标签实用指南

文章导读:AI 辅助学习前端,包含入门、进阶、高级部分前端系列内容,当前是 HTML 的部分,公众号会持续更新,适合零基础的朋友,已有前端工作经验的可以不看,也可以当作基础知识回顾。 HTML5 中新增…

遥测终端赋能水库泄洪监测预警,筑牢度汛安全防线!

4月10日,水利部召开水库安全度汛视频会议。会议要求着力强化水库防洪“四预”措施,加快构建雨水情监测预报“三道防线”,完善预警信息发布机制,推进数字孪生水利工程建设,为科学调度指挥决策提供支持。强调坚决牢牢守住…

Ubuntu Pycharm安装

下载PyCharm,https://www.jetbrains.com/pycharm/download/?sectionlinux 然后按照下图执行安装: 安装的时候可能出现的问题: 问题1:No JDK found. Please validate either PYCHARM_JDK, JDK_HOME or JAVA_HOME environment var…

关于使用后端实现动态表单功能的心得

1、设计方案 1、直接存整体表单结构的json串 优点:相对Mysql细化结构存储,不用在后端处理大量增、删、改的逻辑。如果用mysql对结构体做逻辑删除,可利于回滚。也可用redis、mongodb等实现 缺点:控制粒度不够,不利于需要…

【熵与特征提取】从近似熵,到样本熵,到模糊熵,再到排列熵,包络熵,散布熵,究竟实现了什么?(第六篇)——“散布熵”及其MATLAB实现

今天讲散布熵,之前用了几篇文章分别讲述了功率谱熵、奇异谱熵、能量熵、近似熵、样本熵、模糊熵、排列熵、包络熵这8种类型的熵: Mr.看海:【熵与特征提取】基于“信息熵”的特征指标及其MATLAB代码实现(功率谱熵、奇异谱熵、能量…

使用API有效率地管理Dynadot域名,自查账户信息

关于Dynadot Dynadot是通过ICANN认证的域名注册商,自2002年成立以来,服务于全球108个国家和地区的客户,为数以万计的客户提供简洁,优惠,安全的域名注册以及管理服务。 Dynadot平台操作教程索引(包括域名邮…

使用Python进行异常处理与日志记录的最佳实践

👽发现宝藏 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。 使用Python进行异常处理与日志记录的最佳实践 异常处理和日志记录是编写可靠且易于维护的软…

Hive——DML(Data Manipulation Language)数据操作语句用法详解

DML 1.Load Load语句可将文件导入到Hive表中。 hive> LOAD DATA [LOCAL] INPATH filepath [OVERWRITE] INTO TABLE tablename [PARTITION (partcol1val1, partcol2val2 ...)];关键字说明: local:表示从本地加载数据到Hive表;否则从HD…

Linux gcc day7

动态链接和静态链接 形成的可执行的程序小:节省资源--内存,磁盘 无法c静态库链接的方法 原因是我们没有安装静态c库(.a) 所以要安装 sudo yum install -y glibc-static gcc static静态编译选项提示错误:/usr/lib/ld:ca…

一些常见的Windows命令

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言看版本号查找端口启动程序杀死某个端口查看全部端口看ip进入目录就是总结 前言 提示:这里可以添加本文要记录的大概内容: 例如&#x…

【算法分析与设计】重复的DNA

📝个人主页:五敷有你 🔥系列专栏:算法分析与设计 ⛺️稳中求进,晒太阳 题目 DNA序列 由一系列核苷酸组成,缩写为 A, C, G 和 T.。 例如,"ACGAATTCCG" 是一个 DNA序列 。 在研究…

「 网络安全常用术语解读 」软件物料清单SBOM详解

1. 概览 软件物料清单(Software Bill of Materials,SBOM)是软件成分信息的集合,SBOM文件中记录了软件产品或服务所使用组件、库、框架的清单,用于描述软件构建过程中使用的所有组件及其关系,以实现软件供应…

顺序表的应用-通讯录

顺序表的应用-通讯录 1.操作2.功能要求2.1.功能要求2.2.思路小结2.3.文件梳理2.4.代码实现"SeqList.h""Contact.h""SeqList.c""Contact.c""test.c" 1.操作 链接: 顺序表专题 这篇文章介绍了顺序表的概念与基本操作。 本文将…

【前端技术】CSS基础入门篇

一、 CSS简介 css&#xff08;Cascading Style Sheets&#xff0c;缩写为 CSS&#xff0c;也叫作层叠样式表&#xff09;是一套美化HTML标签所编写出页面的语法&#xff0c;CSS描述了如何在不同设备上渲染内容的方法。 二、 CSS基本引入方法 <!-- Cascading style shet:层…

[Android]Jetpack Compose状态管理

在 Jetpack Compose 中&#xff0c;状态管理是构建交互式应用程序的核心。Compose 设计思想强调了不变性和重新组合的概念&#xff0c;以支持高效的 UI 更新。 一、使用 Remember 和 MutableState 管理状态 remember 和 mutableStateOf 是管理状态的基础工具&#xff0c;特别…

ctfshow web入门 SQl注入 web191--web200

web191 多了一个正则绕过 上脚本布尔盲注 用ord #author:yu22x import requests import string url"http://70adf0cb-2208-4974-b064-50a4f4103541.challenge.ctf.show/api/index.php" sstring.ascii_lettersstring.digits flag for i in range(1,45):print(i)for j…

【C 数据结构】二叉树

文章目录 【 1. 基本原理 】1.1 二叉树的性质1.2 满二叉树1.3 完全二叉树 【 2. 二叉树的顺序存储结构 】2.1 完全二叉树的顺序存储2.2 普通二叉树的顺序存储2.3 完全二叉树的还原 【 3. 二叉树的链式存储结构 】【 4. 二叉树的先序遍历 】4.1 递归实现4.2 非递归实现 【 5. 二…

面试算法十问2(中英文)

算法题 1: 数组和字符串 Q: How would you find the first non-repeating character in a string? 问&#xff1a;你如何找到字符串中的第一个不重复字符&#xff1f; Explanation: Use a hash table to store the count of each character, then iterate through the strin…

计算质数算法

// 计算质数// 输入&#xff1a;n 10// 输出&#xff1a;4// 解释&#xff1a;小于 10 的质数一共有 4 个, 它们是 2, 3, 5, 7 。public static int countPrimes1(int n){boolean[] isPrim new boolean[n];Arrays.fill(isPrim,true);for (int i 2; i*i<n ; i…