理解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的主键值

思考

  • 为何 主键值不要随便更新?
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值