Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

PeterWangLL/Java-Journey

Folders and files

NameName
Last commit message
Last commit date

Latest commit

History

13 Commits

Repository files navigation

Why does InnoDB use B+Tree?

通过本文的学习,希望你可以理解索引的底层数据结构,在此基础上,很多索引设计的技巧和优化方式就水到渠成了;

MySQL默认的存储引擎是InnoDB,而InnoDB就是使用了B+树作为索引的实现,这里首先介绍B+树这种数据结构,为什么在众多数据结构中会选择它?

以下分别说明其他常见数据结构(请自行了解)的缺点:

哈希表:不支持范围查询;

二叉查找树:极端情况下会退化成链表;

平衡二叉树:插入节点时维护成本高;

红黑树。。。

所有的二叉树在面对B树时都是完败的,因为InnoDB操作数据时,首先需要将磁盘上的数据加载到内存中,然后在内存中对数据进行加工,而一次磁盘IO可以理解为从某个节点到子节点到过程,那么树的高度/深度越小,磁盘IO越少,加载数据也就越快。

从名字上也能看出,B+树是在B树的基础上进化而来的,B+树在非叶子节点上只存储索引,在叶子节点上存储索引和数据,并且叶子节点有一条引用链指向与它相临的叶子节点(以表的一行记录为例,索引就是指索引字段,数据就是行记录)

上面说到InnoDB需要将数据加载到内存,它每次会以页(16KB)为单位加载数据,并且单个索引占的空间相比存的数据而言是非常小的,也就是说一次磁盘IO相比B树能够加载的索引树指数级地增加了,那么单个节点的子节点就大大增加了,即树的高度能够显著减小,上面说了树的高度越小,磁盘IO越少。

同时,所有的叶子节点通过指针相连,在范围查询时只要找到第一个满足条件的节点,后面通过指针顺序遍历即可,非常便捷高效。

说了这么多,其实宗旨就是较少磁盘IO。

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Contributors 2

AltStyle によって変換されたページ (->オリジナル) /