分区表对用户来说是一个独立的逻辑表,但是底层是多个物理字表组成的。分区代码实际上是对一组底层表的句柄对象封装。对分区表的请求,都会通过句柄对象转化成储存引擎的接口调用。所以分区对于SQL层来说是一个完全封装底层实现的黑盒子,对应用是透明的。但是底层每个分区都有个使用#分割命名的表文件。
Mysql实现分区的方式--对底层表的封装--意味着索引也按照分区的子表定义的。但是没有全局索引。
和其他数据库一样patition by关键字定义分区,存放分区数据。在执行查询是,优化器会根据分区定义过滤我们不需要的分区,这样无需扫描所有分区。
分区的一个主要的目的是将数据按照一个教粗的粒度分在不同的表中。这样做可以将所有相关的数据放在一起。批量删除和更新操作就会特别的快。
适用场景:
1. 表非常大无法加载内存,或者只有表尾部分数据有有点数据,其他都是历史数据。
2. 分区表数据更好维护。比如删除批量数据通过整个分区。还可以对独立的分区进去优化,检查,和修复等。
3. 分区表可以分散到不同的物理设备上面,高效利用设备。
4. 可以避免某些特殊的瓶颈。例如InnoDB的单个索引互斥访问。 ext3文件系统的inode锁竞争等。
5. 在数据量特别大的情景,可以分区进行备份或者恢复。
分区局限:
1. 一个分区表最多只能有1024个分区。
2. 分区字典如果有主键和唯一索引的列,那么所有的主键列和唯一索引列必须包含进来。
3. 分区表无法使用外键约束。
5. 5.1版本中,分区表达式必须是整数,或者整数的表达式。在5.5后,某些场景可以直接使用列进行分区。
分区原理:
---未完待续