在之前的版本中,分区表的分区管理模式是放在server层,对于底层引擎层而言并不存在分区表的概念,每个分区和普通的表,对InnoDB引擎而言都是等同等低位的。由于需要为每个分区建立handler,这种方式可能导致过多的资源浪费,例如bug#62536 和 bug#37252。
大部分修改对用户而言是透明的,当然,由于分区下推到引擎层,分区信息记录到数据词典表,因此从5.7.6版本开始可以和.par文件say bye bye了。.
简单来说,从如下架构(copy from worklog):
+-----------------+ | main handler | | (ha_partition) | +-----------------+ +---------------+ +---------------+ +---------------+ | part1 handler | | part2 handler | .... | partN handler | | ha_innobase | | ha_innobase | | ha_innobase | +---------------+ +---------------+ +---------------+
转换成:
+-----------------+ | handler | | (ha_innopart) | +-----------------+
当然在存储层依然是划分成多个ibd文件,这样我们可以很方便的增加/删除/交换分区而无需重建整张表。
为了在innodb层管理分区,定义了新的接口ha_innopart,它是ha_innobase的子类(新文件handler/ha_innopart.cc),因此部分接口函数需要在这里被重新定义,例如DDL操作
相关类的关系如下:
具体的修改参考:
git show 7363f343917f5213b840184594844511cc589afb
本文不展开描述具体的实现,单纯记录下相关信息,留待以后有时间再看。