MyISAM和InnoDB底层索引结构

索引和数据的存储

下面有两张表信息,role表使用MyISAM引擎存储,而user表用InnoDB引擎存储:
role表和user表
下面是两种表在磁盘中的索引文件和数据文件:
索引文件和数据文件

  • role表
    • role.frm:表结构文件
    • role.MYD:数据文件(MyISAM Data)
    • role.MYI:索引文件(MyISAM Index)
  • user表
    • user.frm:表结构文件
    • user.ibd:索引和数据文件(InnoDB Index and Data)

由上可知,MyISAM引擎将索引和数据分开文件存储,而InnoDB将索引和数据集中存储。因此,也称MyISAM的索引为非聚集索引,InnoDB的索引为聚集索引。

主键索引和辅助索引结构

对数据库底层实现了解的读者应该都清楚,数据库索引是采用B+ Tree存储,在非叶结点存储索引和指针,在叶节点存储数据和指针。其中,非叶节点存储子树根节点的地址,而叶节点的指针存储数据文件的地址。

  • MyISAM
    • 主键索引
      以col1列作为主键索引,对应结构请看下面示例图:
      MyISAM主键索引结构
      查询流程:持有某条记录的主键id,在B+ Tree中遍历节点,找到含有目标主键id的节点并取得数据文件的存储地址,再到指定存储地址取得数据。
    • 辅助索引
      以col2列作为辅助索引,得到与主键索引相同的结构,请看下面示例图:
      MyISAM辅助索引结构
  • InnoDB
    • 主键索引
      InnoDB主键索引结构
      由于InnoDB为聚集索引,所以叶节点存储了索引以及对应的数据。
    • 辅助索引
      InnoDB辅助索引结构
      以姓名作为辅助索引,节点中存储的不再是id,而是姓名。并且,叶节点中第一行存储辅助索引,第二行存储主键索引。通过第二行主键索引便于查询记录其他数据。

参考:
https://blog.csdn.net/u010922732/article/details/82994253#%E4%B8%80%20%E5%AD%98%E5%82%A8%E5%BC%95%E6%93%8E%E4%BD%9C%E7%94%A8%E4%BA%8E%E4%BB%80%E4%B9%88%E5%AF%B9%E8%B1%A1

-------------本文结束  感谢您的阅读-------------