前言
本文参考了图灵学院线上直播课。
按照陈树义前辈在《聊聊整体性学习方法》一文中提到的思想,本文思路如下:
- 获取:什么是B+树、索引?
- 理解:B+树的特点、索引的作用?
- 扩展:B+树与B-树、AVL树、红黑树、二叉树、Hash的区别?
- 纠错:怎样一眼区分B-树与B+树?
- 应用:如何更好的建表、创建索引?
正文
一、什么是B+树、索引?
B+树是一种数据结构,如下图百度百科所说:
索引是一种有序的存储结构,如下图百度百科所说:
二者间关系就是,再Mysql数据库中,常用B+树的数据结构来存储索引。
二、B+树的特点、索引的作用?
B+树的特点百度百科说是可以保持数据稳定有序,插入与修改拥有较稳定的时间复杂度。
索引的作用百度百科说是相当于图书的目录,可根据目录中的页码快速找到所需的内容。
三、B+树与B-树、AVL树、红黑树、二叉树、Hash的区别?
关于这些树的区别可以参考文章《浅谈AVL树,红黑树,B树,B+树原理及应用》
我凭我浅显的理解,画出了下面这个关系
上图最下面的B+树data之间其实是双箭头关系(老师说这里他画错了),只有这样才能实现区间查询。
其中一些名词解释:
AVL解释:
an AVL tree (Georgy Adelson-Velsky and Landis’ tree, named after the inventors) is a self-balancing binary search tree.
AVL是按照其发明人的姓氏首字母命名的,原名是自动平衡二叉树。
红黑树原名是symmetric binary B-trees 平衡二叉B树
B-树解释:
a B-tree is a tree data structure that keeps data sorted and allows searches, sequential access, insertions, and deletions in logarithmic time. The B-tree is a generalization of a binary search tree in that a node can have more than two children (Comer 1979, p. 123). Unlike self-balancing binary search trees, the B-tree is optimized for systems that read and write large blocks of data. It is commonly used in databases and filesystems.
B-树与B+树属于多路平衡二叉树
上面都是一些树之间的关系,另外还有一个东西叫Hash(哈希)
准确的说,Hash只是一个公式,即Hash函数。如下图百度百科所述:
Hash表与二叉树结合看,如下图:
在Mysql创建索引时,可以选择BTREE与HASH两种索引方式。
二者显著的区别就是:BTREE支持等值查询、区间查询而Hash只支持等值查询。(注意:二者都不支持不等查询,思考一下即可知道,无论BTREE还是HASH,都是通过指定值查询的,对于 != 或 <> 查询,只能进行全表查询)
可以发现,Hash表无论数据有多少,只有一级,因此,查询比BTREE快,但因其不支持区间查询,而被大多数业务所舍弃。
老师在课上还大概估算了一下3级B+树大概能存多少数据,估算方法如下:
Mysql默认B+树一层大小设置为16KB
每层中会存储索引地址(8B/个)和指向下级索引的指针(6B/个),共能存储约 1170个索引节点
1170个索引节点大概能指向16个1KB大小的数据文件(假设1条记录1KB)
最后估算得出,仅仅3层B+树,大概能存储数据量为 1170 * 1170 * 16 ≈ 2000W 条1KB的数据
四、以前一些错误的思想
B-树,读音:B树,- 只是个符号
一眼区分B-树与B+树的方法:
五、如何更好的建表、创建索引?
理论基础已经搭好了,以后实战之后再来补这块…
另外还有一些InnoDB与MyISAM存储引擎的知识,可以参考知乎《Mysql 中 MyISAM 和 InnoDB 的区别有哪些?》