• 叶明
    2024-10-21 来自江苏
    我觉得和系统表空间 ibdata1 有关系,系统表 mysql.indexes 在实例初始化时生成,其元数据信息(如根页面编号)可能被存储在系统表空间里,Innodb 在启动时可以直接访问这些位置,而不需要依赖数据字典。

    作者回复: 这是一个合理的猜想 :) MySQL 8启动时,会加载数据字典(mysql.ibd),数据字典中有一个mysql.dd_properties表,16讲中提到过这个表。从这个表里,能看到一些有意思的数据,包括各个数据字典表的一些内部信息。每个数据字典表索引的root页面编号,这里应该也有。 至于mysql.dd_properties的root页面号,应该是写死在代码中的。 而dd_properties的数据,是在数据库初始化(mysqld --initialize)的时候填充的。

    
    
  • binzhang
    2024-10-21 来自美国
    为啥在二级索引的root和branch page上要存储主键列的值? 感觉没必要啊

    作者回复: 这是一个很好的问题。 如果branch page上不存主键列,在key列有重复值的时候,插入一个key时应该写到那个页面中去? 假设表里已经有很多key-x的记录,在insert values ( 'key-x', 'pk-x')时,怎么定位最终要插入的那个Leaf页面? key列和主键列拼在一起后,就不会有重复的记录了,可以精确定位。

    
    