MYSQL--浅析索引

索引是为了提高数据查询的效率,类似于书的目录。

索引的常见模型有三种:

1.哈希表:

只适用于等值查询,不适用于范围查询

为什么呢?

哈希表是(key,value)的格式存储,存储的数据不一定是按照顺序存的

比如user,有id,name,address三个属性,用id%5作为哈希函数

现在存入3,2,1,4,7几个id,如果我们要找id=2的user,2%5=2,很容易发现他在哈希表的第二个位置,但是id>2的不一定就存在第二个位置以后,比如id=6,6%5=1

那么如果位置冲突怎么办?

上面已经存入了id=2的user,现在要存入id=7的user,7%5=2,也要存在第二个位置

使用拉链法解决

2.有序数组:

更新慢,查询快,查询的时间复杂度是log(n)

但是如果更新,必须要移动更新位置之后的元素

所以有序数组适用于静态的数据库,或者更新很少的数据库。

比如2015年的人口信息,数据不会再改变

3.二叉搜索树:

更新,查询的时间复杂度都是log(n)

一般不推荐使用二叉树

比如一棵 100 万节点的平衡二叉树,树高 20。一次查询可能需要访问 20 个数据块。在机械硬盘时代,从磁盘随机读一个数据块需要 10 ms 左右的寻址时间。也就是说,对于一个 100 万行的表,如果使用二叉树来存储,单独访问一个行可能需要 20 个 10 ms 的时间,这个查询可真够慢的。为了让一个查询尽量少地读磁盘,就必须让查询过程访问尽量少的数据块。那么,我们就不应该使用二叉树,而是要使用“N 叉”树。这里,“N 叉”树中的“N”取决于数据块的大小。以 InnoDB 的一个整数字段索引为例,这个 N 差不多是 1200。这棵树高是 4 的时候,就可以存 1200 的 3 次方个值,这已经 17 亿了。考虑到树根的数据块总是在内存中的,一个 10 亿行的表上一个整数字段的索引,查找一个值最多只需要访问 3 次磁盘。其实,树的第二层也有很大概率在内存中,那么访问磁盘的平均次数就更少了。

N叉树中右边的兄弟比左边的兄弟值大

InnoDB的索引模型:

每一个索引在 InnoDB 里面对应一棵 B+ 树。

索引类型分为主键索引和非主键索引。主键索引的叶子节点存的是整行数据。在 InnoDB 里,主键索引也被称为聚簇索(clustered index)。非主键索引的叶子节点内容是主键的值。在 InnoDB 里,非主键索引也被称为二级索引(secondary index)。

主键索引和普通索引有什么区别:

主键索引:select * from user where id = 10,只用搜索id这颗二叉树

普通索引:select * from user where name='张三',先搜索name这颗二叉树中名字是张三的,再通过name这棵树获取到张三的id,去搜id这颗二叉树,再获取到全部信息。

去搜id这颗二叉树的操作叫做回写

索引维护:b+树的合并,拆裂

索引什么时候使用自增主键,什么时候用自己的属性?

自增主键的插入数据模式,正符合了我们前面提到的递增插入的场景。每次插入一条新记录,都是追加操作,都不涉及到挪动其他记录,也不会触发叶子节点的分裂。而有业务逻辑的字段做主键,则往往不容易保证有序插入,这样写数据成本相对较高。

 

主键长度越小,普通索引的叶子节点就越小,普通索引占用的空间也就越小。所以,从性能和存储空间方面考量,自增主键往往是更合理的选择。

有没有什么场景适合用业务字段直接做主键的呢?还是有的。比如,有些业务的场景需求是这样的:只有一个索引;该索引必须是唯一索引。这就是典型的 KV 场景。由于没有其他索引,所以也就不用考虑其他索引的叶子节点大小的问题。这时候我们就要优先考虑上一段提到的“尽量使用主键查询”原则,直接将这个索引设置为主键,可以避免每次查询需要搜索两棵树。

 

回到主键索引树搜索的过程,我们称为回表。

那么有没有什么方法可以避免回表呢? 

1.覆盖索引:

select id from user where name='张三'

这种的我们可以发现,只需要查找user,那么通过找name这颗二叉树获得id就行,不用回写。

类似上面的过程就叫做覆盖索引

2.最左前缀:联合索引的最左 N 个字段,也可以是字符串索引的最左 M 个字符
3.联合索引:根据创建联合索引的顺序,以最左原则进行where检索,比如(age,name)以age=1 或 age= 1 and name=‘张三’可以使用索引,单以name=‘张三’ 不会使用索引,考虑到存储空间的问题,还请根据业务需求,将查找频繁的数据进行靠左创建索引。
4.索引下推:like 'hello%’and age >10 检索,MySQL5.6版本之前,会对匹配的数据进行回表查询。5.6版本后,会先过滤掉age<10的数据,再进行回表查询,减少回表率,提升检索速度

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

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

相关文章

HDU Integer's Power(容斥原理)

题意 求[l,r]的最大指数和&#xff08;1<l,r<10^18&#xff09; 最大指数和&#xff08;如648^24^32^6,所以64的最大指数和是6&#xff09; 题解 很明显我们可以先求出[1,n]的最大指数和&#xff0c;然后再作差。 我们可以先求出num[i]代表[1,n]中最大指数为i的数有多少个…

人工智能姿态逐渐“亲民”,2021年AI五大趋势备受期待

来源&#xff1a;齐鲁壹点人工智能(AI)已成为多国科技发展领域的“香饽饽”&#xff0c;各国政府以及多家大企业也都不甘示弱&#xff0c;争相砸重金支持该领域的发展&#xff0c;各种创新因此如雨后春笋般喷薄而出。此外&#xff0c;新冠肺炎疫情的肆虐迫使我们进一步加大对于…

MYSQL--三种锁

数据库锁设计的初衷是处理并发问题。作为多用户共享的资源&#xff0c;当出现并发访问的时候&#xff0c;数据库需要合理地控制资源的访问规则。而锁就是用来实现这些访问规则的重要数据结构。根据加锁的范围&#xff0c;MySQL 里面的锁大致可以分成全局锁、表级锁和行锁三类。…

网络请求过程示例

1.域名解析&#xff1a;在客户端&#xff08;浏览器&#xff09;输入http://www.baidu.com&#xff0c;通过DNS解析到该域名对应的IP地址为220.181.27.48 2.数据包通过链路层发送到路由器&#xff0c;通过邻居协议(ARP协议)查找给定IP地址的MAC地址 3.TCP三次握手建立端到端的连…

行业观察 | 全球IoT云平台第一股诞生,IoT离爆发还有多远?

来源&#xff1a; 财经杂志文 &#xff1a;施然2021年3月18日&#xff0c;IoT云平台公司Tuya&#xff08;涂鸦智能&#xff09;上市&#xff0c;这也是目前全球范围内IoT云平台第一股。Tuya的云敲钟仪式在杭州举办&#xff0c;共同参与云敲钟仪式的&#xff0c;除了Tuya的高管团…

Leetcode--23.合并K个排序链表(Java)

合并 k 个排序链表&#xff0c;返回合并后的排序链表。请分析和描述算法的复杂度。 示例: 输入: [ 1->4->5, 1->3->4, 2->6 ] 输出: 1->1->2->3->4->4->5->6 思路&#xff1a;分治法 多个链表&#xff0c;两两合并&#xff0c;第…

SQL2012 之 创建备份计划

打开数据库&#xff0c;选择 管理 → 右键维护计划→选择新建维护计划&#xff0c;填写计划名称&#xff0c;如下图&#xff1a; 修改维护计划参数&#xff0c;如下图&#xff1a; 工具箱->备份数据库任务&#xff0c;拖到计划里&#xff0c;如下图&#xff1a; 编辑“备份数…

薛其坤院士对话马斯克:下一个颠覆性创新是什么?

来源&#xff1a;网易科技报道文&#xff1a;丁广胜他来了&#xff0c;他又来了&#xff0c;马斯克这次在家中远程视频参会中国发展高层论坛。这次很遗憾&#xff0c;马斯克不能现场展示“动感舞蹈”了。他谈到了自动驾驶&#xff0c;也谈到了星际探索。薛其坤院士谈到了太阳能…

redis的底层数据结构

redis:一个key-value系统 Redis 与其他 key - value 缓存产品相比有以下三个特点&#xff1a; Redis支持数据的持久化&#xff0c;可以将内存中的数据保存在磁盘中&#xff0c;重启的时候可以再次加载进行使用。Redis不仅仅支持简单的key-value类型的数据&#xff0c;同时还提…

「九章」量子计算优越性遭北大院士质疑,潘建伟陆朝阳长文回应

来源&#xff1a; 雷锋网作者&#xff1a;付静对量子计算和玻色取样的专业概念的理解存在偏差&#xff0c;或是「九章」受质疑的原因。2020 年 12 月 4 日&#xff0c;我国成功达到量子计算研究第一个里程碑量子计算优越性&#xff08;Quantum Computational Advantage&#xf…

Leetcode--542. 01 矩阵(java)

给定一个由 0 和 1 组成的矩阵&#xff0c;找出每个元素到最近的 0 的距离。 两个相邻元素间的距离为 1 。 示例 1: 输入: 0 0 0 0 1 0 0 0 0 输出: 0 0 0 0 1 0 0 0 0 示例 2: 输入: 0 0 0 0 1 0 1 1 1 输出: 0 0 0 0 1 0 1 2 1 注意: 给定矩阵的元素个数不超过 10000。…

OpenAI又放大招:连接文本与图像的CLIP,在ImageNet上效果媲美ResNet50

来源&#xff1a;AI科技评论公众号编译&#xff1a;蒋宝尚、陈彩娴2020年&#xff0c;通用模型产生了经济价值&#xff0c;特别是GPT-3&#xff0c;它的出现证明了大型语言模型具有惊人的语言能力&#xff0c;并且在执行其他任务方面也毫不逊色。2021年&#xff0c;OpenAI 联合…

[COCI2017-2018#1] Plahte

题面很长&#xff0c;可往往真正有用的题意却没有这么长&#xff0c;例如说这么一句&#xff1a; 床单放在上面&#xff0c;使它们之间角或边不会互相接触&#xff0c; 边也不会相交&#xff0c;但他可能把较小的床单放在大的上面&#xff0c;或者一个完全覆盖另个。 从这句话中…

Leetcode-437. 路径总和 III(Java)

给定一个二叉树&#xff0c;它的每个结点都存放着一个整数值。 找出路径和等于给定数值的路径总数。 路径不需要从根节点开始&#xff0c;也不需要在叶子节点结束&#xff0c;但是路径方向必须是向下的&#xff08;只能从父节点到子节点&#xff09;。 二叉树不超过1000个节…

美国国家创新体系的演化历程、特点及启示

本文来源&#xff1a;微信公众号科情智库原载于《全球科技经济瞭望》2020年12月第35卷第12期作者&#xff1a;李哲、杨晶、朱丽楠&#xff0c;中国科学技术发展战略研究院国家创新体系反映经济活动中科学技术知识生产和配置的整体状况&#xff0c;其着眼点是激励知识生产、提高…

牛客网--字符串合并处理(Java)

按照指定规则对输入的字符串进行处理。 详细描述&#xff1a; 将输入的两个字符串合并。 对合并后的字符串进行排序&#xff0c;要求为&#xff1a;下标为奇数的字符和下标为偶数的字符分别从小到大排序。这里的下标意思是字符在字符串中的位置。 对排序后的字符串进行操作…

再造一个爱因斯坦?GPT-3 让我看到了名人“重生”的希望

作者&#xff1a;Manuel Araoz译者&#xff1a;弯月来源&#xff1a;CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09;自从GPT-3推出以来&#xff0c;我就一直在做各种尝试。这是一项非常酷的技术&#xff0c;我发现最有趣的一项实验就是通过GPT-3与已故去的名人对话。在本…

中文乱码解决

1.url链接设置字符编码 mysql.urljdbc:mysql://127.0.0.1:3306/micro_class?characterEncodingutf-82.数据库编码设置 查看数据库编码&#xff1a;show variables like character%; SET character_set_database utf8; SET character_set_server utf8; 转载于:https://www.c…

牛客网--单词倒排(Java)

题目描述 对字符串中的所有单词进行倒排。 说明&#xff1a; 1、每个单词是以26个大写或小写英文字母构成&#xff1b; 2、非构成单词的字符均视为单词间隔符&#xff1b; 3、要求倒排后的单词间隔符以一个空格表示&#xff1b;如果原字符串中相邻单词间有多个间隔符时&am…

【NOIP模拟】健美猫

题面 分析 此题真是一言难尽。下面这么大一串&#xff0c;真的只是在讲一个小模拟。。。此题也是被几个julao反复讲&#xff0c;各种五花八门的奇淫巧技&#xff0c;什么数学变形&#xff0c;树状数组&#xff0c;差分&#xff0c;单调……好吧&#xff0c;我是那种只会30分暴力…