持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第19天,点击查看活动详情
大家好! 我是慕歌,一只想教你学习 后端技术的野生coder! 欢迎来到慕歌的数据库系列教程,希望通过这个教程带大家深入学习数据库技术,该教程所有知识点均来源于本人的日常学习与开发中,如有疑问请与我联系!
前言
在上一节的分享中,慕歌向大家分享关于数据库索引设计的知识,详细探索了底层索引的设计目的,不同的索引结构,具有各自的优缺点。需要理解的是,索引仍然是一种为数据查询服务的结构,具有一定的数据结构特性,能够实现快速的查询访问也正是由于它的这些结构特性。其中作为数据表核心组成的是聚簇索引,所有的数据都会在最初构建一颗聚簇索引树,用于存放数据,维护数据表的特性,保证数据表的约束有效。
在innodb引擎中,聚簇索引是数据与数据目录进行分离的,数据仍然存放在索引文件中,查询索引即可查询到数据。而在myism引擎中数据和索引进行分离存放,所有建立的索引都是二级索引,需要进行回表操作,以获取最终的数据。
以上就是对两种数据存储引擎的特性,以及设计思路进行的简单回顾,那么这一节我们将深入索引的底层存储数据结构进行分析,也就是常说的B+树存储结构,分析该数据结构的优势,以及如何最大化该数据结构性能。
索引数据结构
概述:
在整个数据存储结构中存在几种较为高效的数据存储结构,如哈希表,AVL树,平衡树,红黑树,B树,B+树。在某些情况下,这些数据结构都具有优异的性能。
哈希:
在任何一种语言中,哈希都具有极高的价值,用于数据存储,数据加密,提取哈希码。
二叉树:
这里的二叉树包括平衡树,红黑树等二叉结构的树形数据结构
- 底层数据结构为树,但是树具有不同的特性
- 保证数据的有序性,但是不保证数据的连续性
- 保证在o(logN)的复杂度内获取到数据
- 底层由二叉树的平衡算法进行维护,保证数据的有序
- 树的层级不会很高,但是数据量极高的时候,性能低下
B树:
B树与B+树是不同的两种结构,他们都是多子节点树,每个节点内包含2-N个节点
- 底层数据结构是多节点树,包含2-n个节点
- 保证数据的有序性,非叶子节点是子节点的抽离
- 非叶子节点用于构建索引,便于快速查询
- 子节点保存数据,并通过链表进行连接
- 叶子节点本身按照顺序进行有序的链接,形成有序链表
索引选择
innodb:
选择B+树作为索引,作为更加性能更加优秀的存储结构。由于在数据查询中性能考量最重的因素是磁盘IO的,如何能够最高效的执行查询,并在尽可能少的IO 中完成。
- 二叉树由于平衡性,以及查询复杂度问题,可在小数据范围时使用
- 哈希表,在少量数据时具有最好的性能,并且极低的IO次数
- B树由于数据块的引入,具有更低的层,IO次数更少
- B+树在具有B树性能优势的同时,通过对数据块,索引块的分离,性能得到进一步的提升
- B+的块大小为16K,一个块中大概存储1k 的数据,三层索引可维护10亿的数据量,能满足绝大多数数据规模
- B+ 树的数据存储在叶子节点,能稳定在3-4次IO下获取数据节点数据
- B+树支持最左匹配,以及范围查询,依赖子节点的链表链接
- B+树支持order by 以及like 模糊匹配,利用数据存储的关键字有序性
结语
这一节的分享到这里就结束了,下一节将带来数据库分析工具的学习!
如果您觉得本文不错,欢迎点赞支持,您的关注是我坚持的动力!