再有人问你为什么MySQL用B+树做索引,就把这篇文章发给她
副问题[/!--empirenews.page--]
索引这个词,信托大大都人已经相等认识了,许多人都知道MySQL的索引首要以B+树为主,可是要问到为什么用B+树,生怕很少有人能把前因效果报告的很完备。本文就来从新到尾先容下数据库的索引。 索引是一种数据布局,用于辅佐我们在大量数据中快速定位到我们想要查找的数据。 索引最形象的比喻就是图书的目次了。留意这里的大量,数据量大了索引才显得故意义,假如我想要在[1,2,3,4]中找到4这个数据,直接对全数据检索也很快,没有须要艰辛气建索引再去查找。索引在mysql数据库平分三类: B+树索引、Hash索引、全文索引 我们本日要先容的是事变开拓中最常打仗到innodb存储引擎中的的B+树索引。 要先容B+树索引,就不得不提二叉查找树,均衡二叉树和B树这三种数据布局。B+树就是从他们仨演化来的。 二叉查找树 起首,让我们先看一张图
从图中可以看到,我们为user表(用户信息表)成立了一个二叉查找树的索引。图中的圆为二叉查找树的节点,节点中存储了键(key)和数据(data)。 键对应user表中的id,数据对应user表中的行数据。二叉查找树的特点就是任何节点的左子节点的键值都小于当前节点的键值,右子节点的键值都大于当前节点的键值。 顶端的节点我们称为根节点,没有子节点的节点我们称之为叶节点。 假如我们必要查找id=12的用户信息,操作我们建设的二叉查找树索引,查找流程如下:
操作二叉查找树我们只必要3次即可找到匹配的数据。假如在表中一条条的查找的话,我们必要6次才气找到。 均衡二叉树 上面我们讲授了操作二叉查找树可以快速的找到数据。可是,假如上面的二叉查找树是这样的结构: 这个时辰可以看到我们的二叉查找树酿成了一个链表。 假如我们必要查找id=17的用户信息,我们必要查找7次,也就相等于全表扫描了。 导致这个征象的缘故起因着实是二叉查找树变得不服衡了,也就是高度太高了,从而导致查找服从的不不变。 为了办理这个题目,我们必要担保二叉查找树一向保持均衡,就必要用到均衡二叉树了。 均衡二叉树又称AVL树,在满意二叉查找树特征的基本上,要求每个节点的阁下子树的高度不能高出1。 下面是均衡二叉树和非均衡二叉树的比拟: 由均衡二叉树的结构我们可以发明第一张图中的二叉树着实就是一棵均衡二叉树。 均衡二叉树担保了树的结构是均衡的,当我们插入或删除数据导致不满意均衡二叉树不服衡时,均衡二叉树会举办调解树上的节点来保持均衡。详细的调解方法这里就不先容了。 均衡二叉树对比于二叉查找树来说,查找服从更不变,总体的查找速率也更快。 B树 由于内存的易失性。一样平常环境下,我们城市选择将user表中的数据和索引存储在磁盘这种外围装备中。 可是和内存对比,从磁盘中读取数据的速率会慢上百倍千倍乃至万倍,以是,我们该当只管镌汰从磁盘中读取数据的次数。 其它,从磁盘中读取数据时,都是凭证磁盘块来读取的,并不是一条一条的读。 假如我们能把只管多的数据放进磁盘块中,那一次磁盘读取操纵就会读取更大都据,那我们查找数据的时刻也会大幅度低落。 假如我们用树这种数据布局作为索引的数据布局,那我们每查找一次数据就必要从磁盘中读取一个节点,也就是我们说的一个磁盘块,我们都知道均衡二叉树然则每个节点只存储一个键值和数据的。 那声名什么? 声名每个磁盘块仅仅存储一个键值和数据! 那假如我们要存储海量的数据呢? 可以想象到二叉树的节点将会很是多,高度也会及其高,我们查找数据时也会举办许多次磁盘IO,我们查找数据的服从将会极低! 为了办理均衡二叉树的这个破绽,我们应该探求一种单个节点可以存储多个键值和数据的均衡树。也就是我们接下来要说的B树。 B树(Balance Tree)即为均衡树的意思,下图等于一颗B树。
图中的p节点为指向子节点的指针,二叉查找树僻静衡二叉树着实也有,由于图的雅观性,被省略了。- 图中的每个节点称为页,页就是我们上面说的磁盘块,在mysql中数据读取的根基单元都是页,以是我们这里叫做页更切合mysql中索引的底层数据布局。 从上图可以看出,B树相对付均衡二叉树,每个节点存储了更多的键值(key)和数据(data),而且每个节点拥有更多的子节点,子节点的个数一样平常称为阶,上述图中的B树为3阶B树,高度也会很低。 基于这个特征,B树查找数据读取磁盘的次数将会很少,数据的查找服从也会比均衡二叉树高许多。 (编辑:湖南网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |