
均衡二叉树扭转
经由过程一次左旋操作就将插入后的树从新变为均衡二叉树是最简单的情况了,实际应用处景中可能须要扭转多次。至此我们可以推敲一个问题,均衡二叉树的查找效力还不错,实现也异常简单,响应的保护成本还能接收,为什么 MySQL 索引不直接应用均衡二叉树?
跟着数据库中数据的增长,索引本身大年夜小随之增长,弗成能全部存储在内存中,是以索引往往以索引文件的情势存储的磁盘上。如许的话,索引查找过程中就要产生磁盘 I/O 消费,相对于内存存取,I/O 存取的消费要高几个数量级。可以想象一下一棵几百万节点的二叉树的深度是若干?如不雅将这么大年夜深度的一颗二叉树放磁盘上,每攫取一个节点,须要一次磁盘的 I/O 攫取,全部查找低砟瓯显然是不克不及够接收的。那么若何削减查找过程中的 I/O 存取次数?
4. 优化 UNION
一种行之有效的解决办法是削减树的深度,将二叉树变为 m 叉树若干好多路搜刮树),而 B+Tree 就是一种多路搜刮树。懂得 B+Tree 时,只须要懂得其最重要的两个特点即可:第一,所有的关键字(可以懂得为数据)都存储在叶子节点(Leaf Page),非叶子节点(Index Page)并不存储真正的数据,所有记录节点都是按键值大年夜小次序存放在同一层叶子节点上。其次,所有的叶子节点由指针连接。如下图为高度为 2 的简化了的 B+Tree。

- select film_id,actor_id from film_actor where actor_id = 1
- union all
- select film_id,actor_id from film_actor where film_id = 1 and actor_id <> 1
- 当出现多个索引做订交操作时若干好多个 AND 前提),平日来说一个包含所有相干列的索引要优于多个自力索引。
- 当出现多个索引做结合操作时若干好多个 OR 前提),对结不雅集的归并、排序等操作须要消费大年夜量的 CPU 和内存资本,特别是当个中的某些索引的选择性不高,须要返回归并大年夜量数据时,萌芽成本更高。所以这种情况下还不如走全表扫描。
简化 B+Tree
怎么懂得这两个特点?MySQL 将每个节点的大年夜小设置为一个页的┞符数倍(原因下文会介绍),也就是在节点空间大年夜小必定的情况下,每个节点可以存储更多的内结点,如许每个结点能索引典范围更大年夜更精确。所有的叶子节点应用指针链接的好处是可以进行区间拜访,比瘸老图中,如不雅查找大年夜于 20 而小于 30 的记录,只须要找到节点 20,就可以遍历指针依次找到 25、30。如不雅没有链接指针的话,就无法进行区间查找。这也是 MySQL 应用 B+Tree 作为索引存储构造的重要原因。
MySQL 为何将节点大年夜小设置为页的┞符数倍,这就须要懂得磁盘的存储道理。磁盘本身存取就比主存慢很多,在加上机械袈渌动损耗(特别是通俗的机械硬盘),磁盘的存取速度往往是主存的几百万分之一,为了尽量削减磁盘 I/O,磁盘往往不是严格按需攫取,而是每次都邑预读,即使只须要一个字节,磁盘也会大年夜这个地位开端,次序向后攫取必定长度的数据放入内存,预读的长度一般为页的┞符数倍。
MySQL 经由过程关键字将 SQL 语句进行解析,并生成一棵对应的解析树。这个过程解析器重要经由过程语律例则来验证和解析。比如 SQL 中是否应用了缺点的关键字或者关键字的次序是否精确等等。预处理则会根据 MySQL 规矩进一步检查解析树是否合法。比如检查要萌芽的数据表和数据列是否存在等。
“页是计算机治理存储器的逻辑块,硬件及 OS 往往将主存和磁盘存储区瓜分为持续的大年夜小相等的块,每个存储块称为一页(很多 OS 中,页的大年夜小平日为 4K)。主存和磁盘以页为单位交换数据。当法度榜样要攫取的数据不在主存中时,会触发一个缺页异常,此时体系挥蒡磁盘发出读盘旌旗灯号,磁盘会找到数据的肇端地位并向后持续攫取一页或几页载入内存中,然后一路返回,法度榜样持续运行。”
MySQL 奇妙应用了磁盘预读道理,将一个节点的大年夜小设为等于一个页,如许每个节点只须要一次 I/O 就可以完全载入。为了达到这个目标,每次新建节点时,直接申请一个页的空间,如许就包管一个节点物理上也存储在一个页里,加之计算机存储分派都是按页对齐的,就实现了攫取一个节点只需一次 I/O。假设 B+Tree 的高度为 h,一次检索最多须要 h-1I/O(根节点常驻内存),复杂度 $O(h) = O(\log_{M}N)$。实际应用处景中,M 平日较大年夜,经常跨越 100,是以树的高度一般都比较小,平日不跨越 3。
最后简单懂得下 B+Tree 节点的操作,在整体上对索引的保护有一个大年夜概的懂得,固然索引可以大年夜大年夜进步萌芽效力,但保护索引仍要花费很大年夜的价值,是以合理的创建索引也就尤为重要。
仍以膳绫擎的树为例,我们假设每个节点只能存储 4 个内节点。起重冲要入第一个节点 28,如下图所示。

leaf page 和 index page 都没有满
接着插入下一?节点 70,在 Index Page 中萌芽后得知应当插入到 50 – 70 之间的叶子节点,但叶子节点已满,这时刻就须要进行也决裂的操作,当前的叶子节点起点为 50,所以根据中心值来拆分叶子节点,如下图所示。
推荐阅读
开辟者大年夜赛路演 | 12月16日,技巧立异,北京不见不散 Hadoop的搭建有三种方法,单机版合适开辟调试;伪分布式版,合适模仿集群进修;完全分布式,临盆应用的模式。这篇文件介绍若何搭建完>>>详细阅读
本文标题:万字干货总结:MySQL优化原理学习,这一篇就够了!
地址:http://www.17bianji.com/lsqh/39574.html
1/2 1

网友点评
精彩导读
科技快报
品牌展示