理解InnoDB数据及索引文件存储格式
InnoDB存储引擎的数据(包括索引)存放在相同的文件中,这一点和MySQL默认存储引擎MyISAM的区别较大
,后者分别存放于独立的文件。除此之外,InnoDB的数据存放格式也比较独特,每个InnoDB表都会将主键以聚簇索引的形式创建。所有的数据都以主键升序排列在物理磁盘上面,所以主键查询并且以主键排序的查询效率也会非常高
。
由于主键是聚簇索引的,InnoDB基于主键的查询效率非常高
。如果在创建一个InnoDB存储引擎表时并没有创建主键,那么InnoDB会尝试创建于表上的其他索引。如果存在由单个not null属性列的唯一索引,InnoDB则会选择该索引作为聚簇索引。如果没有任何单个not null属性列的唯一索引,InnoDB会自动生成一个隐藏的内部列,该列会在每行数据上占用6个字节的存储长度。所以,实质上每个InnoDB表都至少会有一个索引存在
。
在InnoDB上面除了聚簇索引之外的索引,都被称为secondary index,每个secondary index上都含有聚簇索引的索引键信息,方便通过其他索引查找数据的时候能够更快地定位数据位置。
当然,聚簇索引并不是只有优点,没有任何缺点,要不然其他数据库早就大力推广了
。聚簇索引的最大问题就是索引键被更新造成的成本并不只是索引数据可能会移动,而是相关的所有记录数据都须要移动。所以,为了性能考虑,尽可能不要更新InnoDB的主键值
。
Page
InnoDB存储引擎中的所有数据,不论是表还是索引,或是存储引擎自己的各种结构,都以page作为最小物理单位来存放
,每个page默认大小为16KB。
extent
extent是一个由多个连续page组成的一个物理存储单位。一般来说,每个extent为64个page。
segment
segment在InnoDB存储引擎中实际上也代表“files”的意思,每个segment由一个或多个extent组成,而且每个segment都存放同一种数据
。一般来说,每个表数据会存放于一个单独的segment中,实际上也就是每个聚簇索引会存放于一个单独的segment中。
tablespace
tablespace是InnoDB中最大物理结构单位,由多个segment组成
。当tablespace中的某个segment须要增长的时候,InnoDB最初仅仅分配某一个extent的前32个page,如果继续增长才会分配整个extent来使用
总结
- 为了性能考虑,尽可能不要更新InnoDB的主键值
思考
- 为何 主键值不要随便更新?
理解InnoDB数据及索引文件存储格式相关推荐
- mysql 5.7 innodb 预热_mysql5.7 InnoDB数据表空间文件平滑迁移
[ERROR] [FATAL] InnoDB: Tablespace id is 14 in the data dictionary but in file ./mysql/innodb_index_ ...
- 大数据:Parquet文件存储格式
一.Parquet的组成 Parquet仅仅是一种存储格式,它是语言.平台无关的,并且不需要和任何一种数据处理框架绑定,目前能够和Parquet适配的组件包括下面这些,可以看出基本上通常使用的查询引擎 ...
- 59.排序好的大数据创建索引文件,并实现大文件的二分查找,根据索引百万数据秒读数据...
创建索引 1 //创建索引 2 struct index 3 { 4 //保存每行偏移的位置 5 int *pindex; 6 //文件的总长度 7 int length; 8 }allindex;/ ...
- MySQL 高级 —— 深入理解 InnoDB 与 MyISAM
引言 在文件系统中,MySQL将每个数据库(也可以称之为schema)保存为数据目录下的一个子目录.创建表时,MySQL会在数据库子目录下创建一个与表同名的.frm文件保存表的定义.因为MySQL使用 ...
- RC ORC Parquet之大数据文件存储格式的一哥之争
背 景 大数据如火如荼的发展中,以hadoop集群为基础的数据存储和计算框架也日新月异的精进,而如何减少存储空间又提升计算效率,一直是大数据集群老生常谈的问题,今天就一起聊聊最基本的大数据文件存储 ...
- 面试题:mysql 表删除一半数据,B+树索引文件会不会变小???
今日寄语:努力的阶段,往往是最不养生的阶段! 一张千万级的数据表,删除了一半的数据,你觉得B+树索引文件会不会变小? (答案在文章中!!) 我们先来做个实验,看看表的大小是如何变化的?? 做个实验,让 ...
- 深入理解InnoDB(4)—索引使用
1. 索引的代价 在了解索引的代价之前,需要再次回顾一下索引的数据结构B+树 如上图,是一颗b+树,关于b+树的定义可以参见B+树,这里只说一些重点,浅蓝色的块我们称之为一个磁盘块,可以看到每个磁盘块 ...
- 深入理解InnoDB(3)—索引的存储结构
1. 索引的各种存储结构及其优缺点 1.1 二叉树 优点: 二叉树是一种比顺序结构更加高效地查找目标元素的结构,它可以从第一个父节点开始跟目标元素值比较,如果相等则返回当前节点,如果目标元素值小于当前 ...
- MySQL(六):InnoDB数据文件
尺有所短,寸有所长:不忘初心,方得始终. 请关注公众号:星河之码 一.数据文件的组成 innodb数据逻辑存储形式为表空间,而每一个独立表空间都会有一个.ibd数据文件,ibd文件从大到小组成: 一个 ...
最新文章
- 高压放电与防静电塑料包装
- arcgis 投影坐标系转地理坐标系_ArcGIS的地理坐标系、大地坐标系
- 【软考】面向对象程序设计复习指南
- 关于iis w3wp.exe
- 1、SVPWM空间矢量脉宽调制和基本原理
- oppo android版本升级失败,oppo怎么刷机以及刷机失败的原因
- autocad.net-图片打印合成
- 叉乘点乘混合运算公式_《3D数学基础》提炼总结(四)向量运算(后)
- linux用户是什么意思,Linux中的./是什么意思
- 少儿编程的感想与实践
- java实现excel打印_java实现 excel 打印 问题
- 硬件大厂技术一面题目
- fmdb(FMDatabase) 数据库总结
- java web属于什么语言_java web开发是什么
- 废旧三元锂电池回收提镍钴锰
- 【转载】何时使用领域驱动设计
- C++ 代码覆盖率分析工具
- HADOOP组成部分
- R语言主成分分析可视化(颜值高,很详细)
- window常用命令合集
热门文章
- Hls之Hls.js源码解析
- vue + elementUI 框架下给el-table 增加一条数据,默认滚动条定位到表格的最底部
- lisp语言cond和if套用_AutoCAD LISP 循环选择语句cond
- python int函数的实现_python实现int函数的案例分析
- java array 元素的位置_介绍java中的两种排序工具Arrays和Collections
- 标签在线调整 http://labelary.com/viewer.html
- JavaEE系统架构师学习路线
- 查询 mysql所有表名
- stride padding_关于Padding实现的一些细节
- python如何打印文字_python怎么打印字符