mysql之给字符串加索引

news/2024/5/20 16:59:11/文章来源:https://blog.csdn.net/qq_41820066/article/details/127519905

文章目录

    • 前言
    • 长字段加索引
    • 前缀索引对覆盖索引的影响
    • 合理的使用前缀索引
    • 总结

前言

之前的文章介绍了主键索引和唯一索引的区别,也介绍了主键索引和唯一索引在不同业务场景下的区别。今天我们继续介绍,普通索引怎么合理的使用。

长字段加索引

这里我们就用邮箱举个例子。大多数的邮箱都比较长,格式一般为xxxxx@xxx.com。那我们加索引的话,一般有两种形式


mysql> alter table SUser add index index1(email);
或
mysql> alter table SUser add index index2(email(6));

一个指定了索引的长度,一个没有指定索引的长度。有什么区别呢,显而易见,一个索引存储的长度是6,一个索引存储的长度是整个邮箱的长度
在这里插入图片描述
在这里插入图片描述
这两个查询有什么区别呢,其实就是比如前六个字符串有四个相同的,它会先扫描第一个,然后去主键索引上取值匹配,发现不匹配,接着下一个,下一个匹配成功,加入结果集,知道前六个匹配不到为止。而全部索引也是一样。但是全部索引到主键索引取值的次数会少。这个就是区分度的问题。如果前六个字段的区分度和整个索引的区分度一样。那么就不会有这个问题。

前缀索引对覆盖索引的影响

前缀索引会导致覆盖索引失效,原因就是即使索引a加上前缀索引b匹配上了,它也需要去主键索引取值匹配,因为他不知道你这个索引截取的是否是全的,即使你前缀索引是全的,它也会去主键取值匹配。

合理的使用前缀索引

第一种选取合适的长度:相比学过算法的同学都知道,算法的本质就是在空间和时间上取一个平衡点。
这个同样,在前缀索引长度和区分度之间取一个平衡点即可
下面是查询不同长度的前缀索引的区分度


mysql> select count(distinct left(email,4)as L4,count(distinct left(email,5)as L5,count(distinct left(email,6)as L6,count(distinct left(email,7)as L7,
from SUser;

第二种采用倒叙存储:如存储身份证的时候,我们可以采用后几位进行区分,这个时候你可以把身份证倒着存储。下面是倒着存储的查询方式。


mysql> select field_list from t where id_card = reverse('input_id_card_string');

第三种使用hash字段:比如身份证,你可以再加一个字段作为校验字段。比如通过crc32函数生成校验码。


mysql> select field_list from t where id_card_crc=crc32('input_id_card_string') and id_card='input_id_card_string'

.

最后总结下集中方式的区别
第一种:比较通用,但是不好取舍。
第二种和第三种:不同担心取舍的问题。基本都能保证区分度。但是不支持范围查找。
这里我们在说下23种的区别
1.空间消耗,hash字段会有额外的空间消耗,但是如果倒叙字段过长,其实两个是差不多的。
2.性能方面:一个是用reverse函数,一个使用crc函数,相比较来说,可能crc会稍微好一点,但是很有限。
3.查询效率:hash虽然会有冲突,但是概率会比较低,所以可以认为每次都是唯一匹配,扫描行数为1,但是倒叙索引也是前缀索引,如果不能像主键索引一样完全区分,还是会增加扫描行数的。

总结

总的来说,第三种还是比行的一种方法,相对于前缀索引和倒序索引,不管是存储还是查询效率方面来说,都是比较强的。但是我这里有一点问题,就是函数可能会导致索引失效,不知道这个reverse函数和crc函数会不会导致索引失效(这个问题我也不是很清楚,希望有知道的大佬评论区捞我一把)。

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

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

相关文章

Spring6.0全新发布,快来看看

Spring6.0全新发布,快来看看 Spring Framework 6.0 发布了首个 RC 版本。 翻译后页面(有点好笑): On behalf of the team and everyone who has contributed, I am pleased to announce that Spring Framework is available now.6.0.0-RC2 Spring Frame…

零信任如何给为企业的数字资源保驾护航?

零信任安全最早由著名研究机构Forrester的首席分析师约翰.金德维格在2010年提出。 零信任安全针对传统边界安全架构思想进行了重新评估和审视,并对安全架构思路给出了新的建议。 零信任模型是什么 零信任是一种基于严格身份验证的网络安全架构。、 在该架构下&am…

【SpringBoot笔记12】SpringBoot框架实现文件上传和文件下载

这篇文章,主要介绍如何使用SpringBoot框架实现文件上传和文件下载。 目录 一、SpringBoot文件上传 1.1、引入依赖 1.2、编写文件上传页面 1.3、编写文件上传代码 (1)MultipartFile对象 (2)ResourceUtils工具类 …

音频拼接在一起怎么做?这篇文章来告诉你

随着互联网的发展,很多优质歌曲都纷纷地呈现在大家眼前,而将不同的音乐合并在一起,并且放入视频里,也是别有一番风味,那么许多人会好奇音频如何拼接在一起呢?下面就为大家分享两个好用的方法,只要一点时间…

【C++】使用对象自动管理指针(用到运算符重载)

文章目录1. 首先设计整型类&#xff1a;class Int普通指针2. 设计一个Object类&#xff0c;并设计Int类型的指针。那如何获取Int类型的值呢&#xff1f;1. 首先设计整型类&#xff1a;class Int class Int { private:int value; public:Int(int x 0) :value(x){cout <<…

Springbootg整合validation整合

坚持年年写博客&#xff0c;不能断了&#xff0c;所以粘贴平时写的一份笔记吧 一、简介 校验参数在以前基本都是使用大量的if/else&#xff0c;稍微方便一点的可以使用反射自定义注解的形式&#xff0c;但是复用性不是很好&#xff0c;并且每个人对于的自定义注解有着自己的使…

Java基础-任务执行服务

今天小编带领大家一起来探索Java中的任务执行服务 关于任务执行服务&#xff0c;我们介绍了&#xff1a; 任务执行服务的基本概念。 主要实现方式&#xff1a;线程池。 定时任务。 &#xff08;1&#xff09;基本概念 任务执行服务大大简化了执行异步任务所需的开发&…

算法 - 最少交换次数来组合所有的 1 II

目录 题目来源 题目描述 示例 提示 题目解析 算法源码 题目来源 2134. 最少交换次数来组合所有的 1 II - 力扣&#xff08;LeetCode&#xff09; 题目描述 交换定义为选中一个数组中的两个 互不相同 的位置并交换二者的值。 环形数组是一个数组&#xff0c;可以认为 第…

第五章:乱序执行

1.概念 指令在执行时常常因为一些限制而等待。例如&#xff0c;MEM单元访问的数据不在cache中,需要从外部存储器中取&#xff0c;这个过程通常需要几十、几百个Cycle&#xff0c;如果是顺序执行的内核,后面的指令都要等待&#xff0c;而如果处理器足够智能&#xff0c;就可以先…

修改数组(秋季每日一题 31)

给定一个长度为 nnn 的正整数数组 a1,a2,…,ana_1,a_2,…,a_na1​,a2​,…,an​。 你可以任意改变其中任意元素的值。 但是&#xff0c;改变后的元素的值仍需是正整数。 将一个元素的值从 aaa 变为 bbb 所需要付出的代价为 ∣a−b∣|a−b|∣a−b∣。 对于一个正整数 ttt&am…

Elasticsearch 查询详解

1 数据准备 PUT student_index {"settings": {"number_of_shards": 1,"number_of_replicas": 0},"mappings": {"properties": {"birthday": {"type": "date","format": "yyy…

AcmHelper -运行在本地的Acm帮手

AcmHelper 详见github 本地环境下的 Polygon , 但不止于 Polygon. 你可以 快速创建具有合理结构的题目文件夹指定 std , checker , validator , interactor使用不同语言完成不同部分 (cpp/py)使用额外的程序来测试数据的质量使用预制的数据生成器快速生成具有某些特征的数据…

Python爬虫|采集开源众包的悬赏任务,自动翻页

前言 现在互联网,有很多网站提供一些接单外派的形式,提供给有能力的人或者团队去接单。比如说,很多人熟悉的猪八戒,程序员客栈,CODING 码市,开源众包等等平台,相信很多同学也都知道。 如果要第一时间了解某个接单平台发布的第一手悬赏任务,选择爬虫也是非常不错的选择…

【路径规划】一种考虑COLREGs人工势场的船舶运动规划算法研究附matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;修心和技术同步精进&#xff0c;matlab项目合作可私信。 &#x1f34e;个人主页&#xff1a;Matlab科研工作室 &#x1f34a;个人信条&#xff1a;格物致知。 更多Matlab仿真内容点击&#x1f447; 智能优化算法 …

羧酸修饰Ag2S硫化银量子点,Ag2Se硒化银量子点,Ag2Te碲化银量子点,InP磷化铟量子点

羧酸修饰Ag2S硫化银量子点,Ag2Se硒化银量子点,Ag2Te碲化银量子点,InP磷化铟量子点 羧酸修饰Ag2S硫化银量子点 液一液界面制备近红外荧光Ag2S量子点 Ag:S量子点的制备过程如示意图2A和2B所示,通过向搅拌的硫前体水溶液中快速注人银前体油溶液,反应体系将迅速乳化形成大量液滴…

视频背景不好看?想要给视频里的人物抠出来换背景?教你轻松实现

我们经常能在抖音或者其他短视频平台上看见一些视频背景是经过抠换的&#xff0c;比较常见的是一些舞蹈视频&#xff0c;通过背景抠换&#xff0c;把原本平平无奇的背景换成了灯光特效&#xff0c;这就瞬间变得吸引人眼球了&#xff0c;视频也会变得更加具有特点。如果你也想发…

vlan高级特性super vlan

vlan高级特性super vlan vlan aggregation&#xff0c;vlan的聚合&#xff0c;聚合的目的是减少ip地址的浪费 正常情况将不同的vlan划分到不同的网段&#xff0c; 比如&#xff1a;vlan10–>192.168.1.0/24&#xff0c;vlan20—>192.168.2.0/24 但是如果一个网段只用了…

代码随想录动态规划——一和零

题目 给你一个二进制字符串数组 strs 和两个整数 m 和 n 。 请你找出并返回 strs 的最大子集的大小&#xff0c;该子集中 最多 有 m 个 0 和 n 个 1 。 如果 x 的所有元素也是 y 的元素&#xff0c;集合 x 是集合 y 的 子集 。 示例 1&#xff1a; 输入&#xff1a;strs [“10…

神州数码面试

集合相关 集合用过吗&#xff1f;全部都说一下&#xff1f; 我主要从以下方面回答&#xff1a; 底层结构、如何用、何时用、哪个更合适、是否线程安全&#xff1f; HashMap允许空值吗&#xff1f;线程相关 sleep和wait区别&#xff08;被问3次&#xff09; 共享锁什么意思&am…

NLP算法-关键词提取之LSA / LSI 算法

Gensim工具包引入Gensim简介一些基础概念Gensim的使用方式1、 训练语料的预处理2、主题向量的变换LDA模型 demoLSA/LSI 算法LSA/LSI算法原理LSA/LSI 算法步骤LSA/:SI优缺点LSA/LSI算法 demo引入 书接上回&#xff0c;我们讲到关键词提取中的TF-IDF算法 我们接着讲基于主题模型…