- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章MySQL索引机制(程序员必知)由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
。
MySQL官方对索引的定义为:索引(Index)是帮助MySQL 高效 获取数据的数据结构,而MYSQL使用的数据结构是:B+树 。
在这里推荐大家看一本书,《深入理解计算机系统的书》 。
1.1 局部性原理 。
程序和数据的访问都有聚集成群的倾向,在一个时间段内,仅使用其中一小部分,在最近的将来将用到的信息很可能与现在正在使用的信息在空间地址上是临近的(称空间局部性),或者最近访问过的程序代码和数据,很快又被访问的可能性很大(称时间局部性).
1.2 磁盘预读 。
预读的长度一般为页(page)的整数倍页是存储器的逻辑块,操作系统往往将主存和磁盘存储区分割成连续的大小相等的块,每个存储块称为一页(在许多操作系统中,页大小通常为4K),主存和磁盘以页为单位交换数据 。
1.3 简介 。
在使用数据库中,通常数据库查询是数据库的最主要功能之一。但每种查找算法都只能应用于特定的数据结构之上.
。
2.1 hash 。
这里有一个mysql数据文件,有Id和name两个列,如果我们用hash格式存储的话(hash表),我们只要计算出某一个列的hash值,把它按照按照数组的长度取一个模,就可以取到从0-7n个下标的位置,这样的话效率其实是比较高的,但是用hash表存储,它具备一定的缺点 :
索引格式:
对于树有他是有一个更新跌过的顺序在里面,不要一上来就看结构,先是了解什么树,树都是由一个树根,然后有n多个分支组成,这些分支就是一些树形结构,多你有多个树分支(多元素)的时候,这个时候查找效率就会比较低,因此就有了二叉树的东西,二叉树为什么会好用一点,因为二叉树它是都有两个分支,但是两个分支的话,会导致一个效果,就是每次我们在查找数据的时候,类似于二分查找的,但是二叉树也有自己不太好的地方,大家可以看我们上图中的二叉树的索引格式,在左边的节点会比较短一点(只需要读三次),而右边的节点会长很多(需要读五次),会导致树的深度比较深,每一次树的节点读取,都会有一次IO,深度越高,IO越高,会影响我们数据读取的效率,因此也有了(平衡二叉树)和(红黑树) 。
平衡二叉树: 维护一个平衡,就是左子树和右子树高度之差,不能大于1,但是对于我们上面的格式就不太适合,因为他已经超过1了,但是AVL树也会有一个问题就是调整的次数太频繁了,它里面涉及到了一个操作就是旋转,一种左旋,一个右旋,为了保持平衡需要N多次的旋转,这样的旋转其实是很浪费时间的,每次新增或者删除的时候,都要经历N多次旋转,效率太低了 。
推荐大家一个网站,可以直接看到AVL树操作过程,有不了解的同学可以去看一看,很形象:AVL Trees (Balanced binary search trees) 。
红黑树: 本身也是一个平衡树,但是它从中间做了一个权衡,就是损失一部分平衡的性能,但是又保持了相对的平衡,它做了这样一个操作,就是最长子树的高度,只要不超过最短子树的两倍,就可以了,同时在红黑树中它引入了红和黑两个节点信息,有了这些信息它可以帮助我们做一个平衡,在AVL树有旋转保持平衡,而红黑树有了旋转和变色两种来保持平衡,红黑树是AVL树的进阶,它损失了一部分平衡的性能,但是维护了我们插入和删除数据的高效,虽然它损失了一部分性能,但是它依然是一个平衡树,既然是平衡树,他最长子树,不超过最短子树的两倍,那意味着如果最短子树是 4 ,那么最长子树就是8,这样在们查找数据的时候,又不是一个二分查找了,效率又会变低 。
无论是二叉树还是红黑树,都会因为树的深度过深而造成IO次数变多,影响数据的读取的效率,最重要的就是减少IO 。
IO是我们IT行业中的一个瓶颈,一个是磁盘IO一个是网络IO,我们作为软件开发,是没有办法去调整硬件方面的瓶颈,只能从从程序里面减少我们的IO量,我们有两个方向,一个是减少IO的次数,一个是减少IO的量,从这两个方面去解决,比如说原来我们读取数据要读10次,现在只要读取一次,这样的IO量就少了10倍,原来我们需要读1MB的数据,现在只要读1KB的数据,这也就是为什么我们在写mysql查询语句的时候不推荐使用select * from ,因为这样的查询会查询到N多个字段,本来我只要两个字段,但是给了我30个字段,这样会导致IO量增加了,因此我们就会去考虑,关于索引的次数能不能减少,因此下面就引出了我们的——B树 。
2.3 B树 。
B树的特点:
B树结构说明:
示例图说明:每个节点占用一个磁盘块,一个节点上有两个升序排序的关键字和三个指向子树根节点的指针,指针存储的是子节点所在磁盘块的地址,两个关键词划分成的三个范围域对应三个指针指向的子树的数据的范围域。以根节点为列,关键字为16和34,p1指针指向的子树的数据范围小于16,P2指针指向的子树的数据范围为16-34,P3指针指向的子树的数据范围大于34 查找关键字(28)过程:
缺点:
2.4 B+树 。
B+Tree 是在BTree 的基础之上做的一种优化,变化如下:
结构图:
注意:在B+Tree上有两个头指针,一个指向根节点,另一个指向关键字最小的叶子节点,而且所有的叶子节点(即数据节点)之间是一种链式环结构,因此可以对B+Tree进行两种查询运算,一种是对于主键的范围查找和分页查找,另一种是从根节点开始,进行随机查找.
。
3.1 mysql innoDB (叶子节点直接放置数据) 。
3.1 mysql innoDB (叶子节点直接放置数据) 。
存放的是对应的行记录 。
1、InnoDB是通过B+Tree结构对主键创建索引,然后叶子节点中存储记录,如果没有主键,那么会选择唯一键,如果没有唯一键,那么会生成一个6位的row_id来作为主键 。
2、如果创建索引的键是其他字段,那么在叶子节点中存储的是该记录的主键,然后在通过主键索引找到对应的记录 。
在name上建立索引 。
在name列上存放的是ID,然后通过ID去找到对应的key和数据 。
3.1 mysql MyISAM 。
下面0X0022其实就是地址,显示根据我们的ID,找到我们的地址,然后通过地址去找到对应的表对应的数据 。
。
mysql索引的五种类型:主键索引、唯一索引、普通索引和全文索引、组合索引。通过给字段添加索引可以提高数据的读取速度,提高项目的并发能力和抗压能力 。
。
小结 。
写这篇文章的时候,小农的公司群消息不断,因为项目中有问题需要我去解决,今天的mysql索引机制就到这里了. 。
原文地址:https://mp.weixin.qq.com/s/GS7F1ABzLWrj0PqRS2R3EA 。
最后此篇关于MySQL索引机制(程序员必知)的文章就讲到这里了,如果你想了解更多关于MySQL索引机制(程序员必知)的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
广播的原则 如果两个数组的后缘维度(从末尾开始算起的维度)的轴长度相符或其中一方的长度为1,则认为它们是广播兼容的。广播会在缺失维度和(或)轴长度为1的维度上进行。 在上面的对arr每一列减去列
之前在讲 MySQL 事务隔离性提到过,对于写操作给读操作的影响这种情形下发生的脏读、不可重复读、虚读问题。是通过MVCC 机制来进行解决的,那么MVCC到底是如何实现的,其内部原理是怎样的呢?我们要
我创建了一个 JavaScript 对象来保存用户在 ColorBox 中检查复选框时设置的值。 . 我对 jQuery 和“以正确的方式”编程 JavaScript 比较陌生,希望确保以下用于捕获用
我为了回答aquestion posted here on SO而玩示例,发现很难理解python的import *破坏作用域的机制。 首先是一点上下文:这个问题不涉及实际问题;我很清楚from fo
我想让我的类具有标识此类的参数 ID。例如我想要这样的东西: class Car { public static virtual string ID{get{return "car";}} }
更新:我使用的是 Java 1.6.34,没有机会升级到 Java 7。 我有一个场景,我每分钟只能调用一个方法 80 次。它实际上是由第 3 方编写的服务 API,如果您多次调用它,它会“关闭”(忽
希望这对于那些使用 Javascript 的人来说是一个简单的答案...... 我有一个日志文件,该文件正在被一个脚本监视,该脚本将注销中的新行提供给任何连接的浏览器。一些人评论说,他们希望看到的更多
我们正在开发针对 5.2 开发的 PHP 应用程序,但我们最近迁移到了 PHP 5.3。我们没有时间去解决所有迁移到 PHP 5.3 的问题。具体来说,我们有很多消息: Declaration of
简介 在实现定时调度功能的时候,我们往往会借助于第三方类库来完成,比如: quartz 、 spring schedule 等等。jdk从1.3版本开始,就提供了基于 timer 的定时调度功能。
Java中,一切都是对象,在分布式环境中经常需要将Object从这一端网络或设备传递到另一端。这就需要有一种可以在两端传输数据的协议。Java序列化机制就是为了解决这个问题而
我将编写自己的自定义控件,它与 UIButton 有很大不同。由于差异太大,我决定从头开始编写。所以我所有的子类都是 UIControl。 当我的控件在内部被触摸时,我想以目标操作的方式触发一条消息。
在我的代码中,在创建 TIdIMAP4 连接之前,我设置了一大堆 SASL 机制,希望按照规定的“最好到最差”顺序,如下所示: IMAP.SASLMechanisms.Add.SASL := mIdS
在 Kubernetes 中,假设我们有 3 个 pod,它们物理上托管在节点 X、Y 和 Z 上。当我使用“kubectl expose”将它们公开为服务时,它们都是集群中的节点(除了 X、Y 和
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 9 年前。 Improve this ques
我知道进程间通信 (ipc) 有几种方法,例如: 文件 信号 socket 消息队列 管道 命名管道 信号量 共享内存 消息传递 内存映射文件 但是我无法找到将这些机制相互比较并指出它们在不同环境中的
当我尝试连接到 teradata 时,出现了TD2 机制不支持单点登录 错误。 在 C# 中,我遇到了类似的问题,我通过添加 connectionStringBuilder.Authetication
我有一个带有 JSON API 的简单 Javascript 应用程序。目前它在客户端运行,但我想将它从客户端移动到服务器。我习惯于学习新平台,但在这种情况下,我的时间非常有限 - 所以我需要找到绝对
我想了解事件绑定(bind)/解除绑定(bind)在浏览器中是如何工作的。具体来说,如果我删除一个已经绑定(bind)了事件的元素,例如使用 jQuery:$("#anElement").remove
我不是在寻找具体答案,只是一个想法或提示。我有以下问题: Android 应用程序是 Web 服务的客户端。它有一个线程,通过 http 协议(protocol)发送事件(带有请求 ID 的 XML
我正在研究 FreeBSD TCP/IP 栈。似乎有 2 种 syn flood 机制,syncookies 和 syncache。我的问题是关于 syncookies,它是从头开始还是在 SYN 队
我是一名优秀的程序员,十分优秀!