索引和数据的存储
下面有两张表信息,role表使用MyISAM引擎存储,而user表用InnoDB引擎存储:
下面是两种表在磁盘中的索引文件和数据文件:
- 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列作为主键索引,对应结构请看下面示例图:
查询流程:持有某条记录的主键id,在B+ Tree中遍历节点,找到含有目标主键id的节点并取得数据文件的存储地址,再到指定存储地址取得数据。 - 辅助索引
以col2列作为辅助索引,得到与主键索引相同的结构,请看下面示例图:
- 主键索引
- InnoDB
- 主键索引
由于InnoDB为聚集索引,所以叶节点存储了索引以及对应的数据。 - 辅助索引
以姓名作为辅助索引,节点中存储的不再是id,而是姓名。并且,叶节点中第一行存储辅助索引,第二行存储主键索引。通过第二行主键索引便于查询记录其他数据。
- 主键索引