1.表分区基本概念
什么是表分区? 表分区mysql自带的数据切分技术,根据一定的规则把存放数据的文件分成了许多小块,存储在磁盘中不同区域。 通过提升磁盘io能力,来加快查询的速度,表分区可以让mysql单表保存更多的数据,提升查询性能。 分区不会更改数据表的机构,发生变化的只是存储方式而已,从逻辑上看就是一张表,但是底层是多个物理分区组成的。 分区是一种表的设计模式,正确的分区可以极大地提升数据库的查询效率,完成更高质量的SQL编程。但是如果错误地使用分区,那么分区可能带来毁灭性的的结果。 分区功能并不是在存储引擎层完成的,因此不只有InnoDB存储引擎支持分区,常见的存储引擎MyISAM、NDB等都支持分区。 但是并不是所有的存储引擎都支持,如CSV、FEDORATED、MERGE等就不支持分区。在使用此分区功能前,应该对选择的存储引擎对分区的支持有所了解。 MySQL数据库在5.1版本时添加了对分区的支持,分区的过程是将一个表或索引分解为多个更小、更可管理的部分。 就访问数据库的应用而言,从逻辑上讲,只有一个表或一个索引,但是在物理上这个表或索引可能由数十个物理分区组成。 每个分区都是独立的对象,可以独自处理,也可以作为一个更大对象的一部分进行处理。 MySQL数据库支持的分区类型为水平分区(指将同一个表中不同行的记录分配到不同的物理文件中),并不支持垂直分区(指将同一表中不同列的记录分配到不同的物理文件中)。 此外,MySQL数据库的分区是局部分区索引,一个分区中既存放了数据又存放了索引。 而全局分区是指,数据存放在各个分区中,但是所有数据的索引放在一个对象中。 目前,MySQL数据库还不支持全局分区。 表分区的优点: 1.表分区的数据可以分布在不同的物理设备上,从而高效的利用多个硬件设备 2.单表可以存储更多的数据 3.表分区存储在不同的设备上,数据的写入和读取的效率提升了,汇总函数计算速度变快了 4.不会出现表锁,只会锁住相关的分区 表分区的缺点: 1.不支持存储过程,存储函数和某些特殊的函数 2.不支持安慰运算符 3.分区键不能使用子查询,一般使用表连接去替代子查询 4.创建表分区后,尽量不要修改数据库模式,会让mysql丢失数据
注意: 每张数据表只能有1024个分区
2.表分区的切分规则
range分区 PARTITIONED BY RANGE COLUMNS # 根据连续区间值切分数据 list分区 PARTITION BY LIST COLUMNS # 根据枚举值切分,切分的字段必须是整数 hash分区 PARTITION BY HASH # 对整数值求模分区数据,切分字段必须是整数(主键递增或者根据函数运算的结果是整数) key分区 PARTITION BY KEY # 对任何数据类型求模切分数据,字符串类型,日期类型,二进制类型都可以 子分区 SUBPARTITION BY XXX # 注意: 只能按照主键字段来切分数据,如果对主键字段切分数据,那么这个表表只能不设置主键了
pass