MySQL innodb存储引擎的数据存储结构
MySQL的存储结构
- 存储结构
- B+树的优点
- 为什么不选择其他的树
- MySQL中B+树的高度与对应的存储数据量计算
- 聚簇索引
- 什么是聚簇索引
- 聚簇索引的优点
- 聚簇索引的局限
存储结构
InnoDB存储引擎使用B+树的数据结构存储数据以及索引。
B+树的优点
这里我就直接说了:显著减少I/O次数,其次是查询速度稳定。
为什么不选择其他的树
什么是B+树不知道?点这里了解B+树。
我们看了B+树的设计结构很容易知道,它的优点。那么为什么不选择其他的树形数据结构,比如二叉查找树(B树也有人叫B-树,其实是同一种),平衡二叉树,或者是红黑树?
其实我们只需要看一下二叉查找树的高度,就可以看出原因,因为树的高度几乎可以看作是I/O的次数。当数据为顺序的时候,比如[1,2,3,4,5,6,7,8,9]的数据,树退化成了链表,树的高度为10,查询效率自然就低了。
你可能会说那二叉平衡树呢?
是的,不可否认,二叉平衡树的高度在存储相同数据时会比二叉查找树低很多,但是我们要知道维护一颗二叉平衡树的代价是很大的。节点的旋转会造成额外的开销,当数据量过大时,往树里面插入一个随机的数据代价可能大到无法接受。
那红黑树呢?HashMap中的链表在桶中数据大于8的时候就会转化为红黑树,那查询效率是不是很高。
同样是树的高度问题,HashMap中是有多个桶的,而我们只有一个“桶”。随着存储的数据的变多,红黑树上的最短路径也会变长,那么树的高度自然就不可避免的变高了。
而我们的B+树在实际应用中的高度基本不会超过四,四基本上就足够应对大部分场景了。
MySQL中B+树的高度与对应的存储数据量计算
不信的话我们可以做一个简单的计算,我们知道MySQL读取磁盘数据,一次读取16k(一页的的大小),一个非叶子节点节点包括索引+指针,我们假设一个节点的大小为14(索引8 + 指针6)字节,那么一页可以存储16*1024/(14) ≈1170个节点,那么我们非叶子节点存储的是一行数据,假设一行数据为1kb, 那么一页存储16行数据,也就是16k。
所以我们B+树的高度为2时,一页的1170个叶子节点可以指向 1170 x 16 = 18720 条数据。
那么高度为3呢?我们的叶子节点个数为,第一层1170个非叶子节点,第一层的每一个节点指向下一页的非叶子节点页,那一页里面同样存在1170个非叶子节点,每个节点对应一行数据,那么第三层的存储的最大数据为 1170 x 1170 x 16 = 21902400,两千多万条数据,约20G大小。
高度为4时就是 21902400 * 1170 = 25625808000,256亿的数据。换算成GB计算的话,约为24438GB的大小。所以一般业务场景只使用到第三层,再大一点第四层也是够用了的。
聚簇索引
什么是聚簇索引
主键索引和数据存放在一起称之为聚簇索引,聚簇索引不是一种索引,而是一种存储数据的数据结构。我们由前文知道了InnoDB的存储引擎使用B+树存储数据,那么表数据怎么存放呢?
叶子节点存放行数据,非叶子节点存放主键,并且按主键顺序排列。大家可以参见上面的B+树结构,相对的非聚簇索引存储结构,比如MyISAM结构如下
以上图片来源高性能的MySQL
聚簇索引的优点
1、可以把相关数据保存在一起。因为时按主键顺序存放的,所以存放的数据是有序的。比如说:我录入学生成绩,学生的成绩就是主键,存放顺序为 0–100,那么我在查询70-80分成绩的同学时,可能只需要一次I/O就可以读取到所有的数据,因为一次会读取一页(16k)。如果是无序的,那么就可能需要多次I/O才能完成。例如一条数据在第一页,读取一次,第二条数据在第二页,读取一次,第三条数据在第10页,读取一次。。。。。。
2、数据访问相较于非聚簇索引更快。这是由于主键索引和表数据存放在一起,找到对应的主键就找到了对应的数据,不像非聚簇索引那样,找到索引之后还需要再去表中查找数据。
3、可以使用覆盖索引查询主键。二级索引中的叶子节点,存放的索引和主键。
聚簇索引的局限
俗话说的好,有利必有弊。那么聚簇索引的局限性有哪些呢?
1、插入、更新数据的代价可能很大。 这个不难理解,因为我们的存储顺序是有序的,当插入或者更新数据时,可能需要移动行数据,导致页分裂的问题。
2、内存足够大时,表数据可以一次全部加载到内存中,聚簇索引基本无效。 我们知道存储结构使用B+树的目的就是减少I/O,但如果不需要[/O,我一次把数据全部读取进内存,那么聚簇索引和非聚簇索引的差别就不大了。
3、导致二级索引占用的存储空间会更大。 聚簇索引的二级索引的叶子节点包含了主键列。
4、二级索引可能需要两次索引查找。 因为不是覆盖索引的话,就需要先从二级索引中找到主键,再去聚簇索引中查找所对应的数据。
5、聚簇索引可能导致全表扫描变慢。 尤其是行稀疏,或者由于页分裂导致数据存储不连续时。
MySQL innodb存储引擎的数据存储结构相关推荐
- mysql存储引擎innodb_MySQL常用存储引擎之Innodb
1. mysql 5.5及之后版本默认存储引擎 为不了解存储引擎的数据库使用者,提供了很大的便利,因为innodb适应大部分应用场景. 和myisam不同的是,innodb是一种事务型存储引擎.也就是 ...
- 13、不同存储引擎的数据表在文件系统里是如何表示的?
MySQL 支持 InnoDB.MyISAM.Memory.Merge.Archive.CSV.BLACKHOLE 几种存储引擎,不同存储引擎的数据表在文件系统中的表示也各不相同. MySQL 中的每 ...
- 【MySQL】InnoDB行格式、数据页结构以及索引底层原理分析
目录 一.MySQL架构图 二.InnoDB数据页结构 2.1 局部性原理 2.2 InnoDB的数据页格式 三.InnoDB的行格式 3.1 Compact行格式 3.1.1 变长字段长度列表 3. ...
- mysql查询数据库存储引擎_MySQL数据库存储引擎
存储引擎就是指表类型,数据库存储引擎决定了表在计算机中的存储方式. 1,查询mysql数据库支持的存储引擎类型:SHOW ENGINES \G("\G"的作用是让结构显示的更加美观 ...
- 简述mysql 存储引擎_Mysql基础-存储引擎简述
说明:Mysql服务器提供了丰富的存储引擎供我们选择,并且给我们提供了足够的可配性,完全可以根据实际需要实现自定义. Mysql 的存储引擎介绍 在数据库中存的就是一张张有着千丝万缕关系的表,所以表设 ...
- oracle有不同的存储引擎吗,什么是存储引擎以及不同存储引擎特性_mysql
什么是存储引擎以及不同存储引擎特点 以前一直玩Oracle数据库,整天围着业务需求和执行计划转,刚刚接触mysql看到存储引擎不慎理解,相应会有与我相同人群存在,所以写文以记之. 首先简单从字面理解, ...
- 如何设计云存储服务端数据存储加密机制
云存储是一种新型的网络存储形式.随着云存储的广泛使用,云存储中的数据安全问题,如数据泄漏.数据篡改,如何设计云存储服务端数据存储加密机制也成了用户广泛关注的问题.云存储可以分为访问层.应用接口层.基础 ...
- mysql内置多个数据存储引擎_一个mysql数据库,既有myisam存储引擎,又有innodb存储引擎,参数如...
key_buffer_size - 这对MyISAM表往说十分紧张.假设只是利用MyISAM表,可以把它设置为可用内存的 30-40%.合理的值取决于索引大年夜小.数据量和背载 -- 记住,MyISA ...
- mysql 存储引擎和数据导入导出
存储引擎 mysql服务软件自带的功能程序,处理表的处理器 每种不同的存储引擎有不同的功能和数据存储方式 show engine 查看引擎 修改引擎 停止服务 修改配置文件 [mysqld] defa ...
- mysql innodb和myisam区别_MySQL?存储引擎简介
大家好,我是anyux.本文介绍MySQL存储引擎. 简介 相当于Linux文件系统,只不过比文件系统强大 功能 数据读写 数据安全和一致性 提高性能 热备份 自动故障恢复 高可用方面支持 引擎类别 ...
最新文章
- 那些参加过创业赛事活动的创业者后来怎么样了?
- python转行it好学吗-转行IT做后端开发,学python还是java?
- 网站排障分析常用的命令
- Qt之QGraphicsView实战篇(很强大)
- 汇顶科技【软件工程师】面经
- u盘在磁盘管理可以显示 但是电脑中找不到_关于U盘你不知道的一些知识
- 软件测试的基础知识(三)
- Linux目录树与文件系统
- w10计算机字体怎么设置在哪里设置,win10电脑字体大小怎么设置_win10如何设置字体大小...
- 自学编程到底有多难?
- XTUOJ-1281-Cute String
- 艾司博讯:拼多多商家sku编码是什么意思
- android 转盘菜单,Android实现可点击的幸运大转盘
- 大数据论文_02_MapReduce(个人总结)
- 夏天最美丽的就应该是荷花了
- Excel提示“此工作簿包含一个或多个无法更新的链接”怎么办
- 微信小程序 报错一大串 define is not defined
- SVG实例入门与动画实战
- 梦幻仙缘剧情java_梦幻仙缘新春赚红包版
- 关于CPU序列号的问题,以及如何获取×64下CPU的ProcessorID