#青训营 x 字节后端训练营#
《MySQL是怎样运行的》第四章——InnoDB记录存储结构 笔记
1、InnoDB的页大小(innodb_page_size),默认16384字节(16KB),在服务器运行时无法修改!!!
2、COMPACT行格式中,变长字段长度列表不止会记录VARCHAR字段的长度,也会记录采用不定长编码集的CHAR字段长度(因为每个字符长度不确定!!!如:gbk中每个字符需要1-2字节,utf8中每个字符需要1-3字节)
3、CHAR(M)最少存储M字节(不足就用无意义字节填充),VARCHAR(M)没有这个限制,主要是为了让更新时不用每次都创建新的记录(节省空间),这是设计者在节省空间和不想因为更新产生记录碎片之间的权衡。
4、记录中存在三种类型的隐藏列,分别是row_id(隐式主键)、trx_id(事务ID)、roll_pointer(undo log的回滚指针),除了row_id不是必需的,其他两个隐藏列都是必须的。
5、row_id是当表中没有显示指定主键,并且不存在不允许为NULL值的UNIQUE约束字段时,InnoDB替我们生成的隐式主键。这主要和InnoDB中数据在聚簇索引中的存储方式有关。聚簇索引要求页中的记录按照主键的顺序排序,且主键需要是唯一值。
6、聚簇索引为什么这么要求呢?我认为是为了配合二级索引的回表操作。聚簇索引中的记录采用唯一且有序的方式排序,可以使二级索引快速回表查询(二级索引是根据记录的主键来进行回表),否则就需要二级索引的回表操作扫描全表了。
展开
评论