mysql分区表索引是怎么存储的?

写在开头

由于以前在生产环境中没有用到分区表,所以只是简单了解了一下分区表的概念,一般来说有四种分区range list hash key四种,今天新公司用到了很多分区表,所以又去实操学习了一下分区表的内容,在学习的过程中产生了一些疑问?

问题:mysql分区表的索引是怎么存储的,是存储一个大的索引树还是针对每个分区单独存储一个索引树?

于是我就带着这个问题去查询实操了一下。mysql的索引可以在information_schema.innodb_sys_indexes表上面查询到索引的类型,这块补充一下:

INNODB_SYS_INDEXES系统表中type代表索引的类型;0:一般的索引,1:不存在主键索引的表,会自动生成一个6个字节(rowid)的标示值,2:unique索引,3:primary索引;

mysql分区表索引是怎么存储的?

这里我用一个表的三个分区表table_id(table_id 可以去information_schema.innodb_sys_tables表里面根据name去查找)去information_schema.innodb_sys_indexes系统表里面查询这三个分区表的索引情况,发现每个分区表都会有主键索引和一个普通索引,这充分说明索引是分开存放的,也就是说每个分区表单独有一颗索引树。

其实我们从mysql对应的数据目录也可以看到一个表在分区后在mysql数据目录会每个分区表生成一个.ibd文件,而ibd文件存的就是索引和数据,所以也能看出来,当然进一步的大家可以去尝试使用github上的工具(innblock和bcview两个小工具,github上可以搜到)查看ibd文件具体的内容。

总结

分区表会将索引分成分区个个数的索引树来存储索引,也就是分开存储。