前言
上一篇介绍了 MySQL 的存储过程和触发器,这一篇将介绍表分区和分库分表相关的内容。
表分区
原本的表文件都是以完整的形式存储在磁盘中,而表分区则是指将一张表的数据拆分成多个磁盘文件,然后放到磁盘中存储。
做了表分区之后,表在逻辑上还是同一张,只是磁盘中会划分为多个文件存储而已,所以表分区并不会影响原有的增删改查操作。
表分区只能进行水平划分,即以行为粒度进行划分,一条记录只能在一个分区中。
好处:
- 相较于使用单个文件存储表数据,表分区技术可以打破单个磁盘分区的容量限制。
- 对于一些失效数据,如三年前的数据,可以通过快速删除分区的方式清理,效率十分高。
- 能够在一定程度上提升磁盘 IO 检索数据的性能,毕竟只需对一小片磁盘表文件做寻道。
- 支持聚合函数的并行执行,比如 sum()、count() 这类函数,可以分别统计各分区的数据做汇总。
- 带来更好的数据管理性和可用性,当一个表文件受损时,不会影响其他分区文件中的表数据。
限制:
- 单张表最多只能创建 1024 个分区,MySQL5.6 版本中拓展到 8192 个。
- MySQL5.1 及之前的版本中,分区键只能选择整数型字段,或支持哈希函数处理的字段。
- 对一个表做了分区后,后续使用表的过程中,无法对表上的其他字段建立唯一索引。
- 分区表中无法创建外键,不过一般情况下表也不允许创建外键,都是靠逻辑上维护主外关系。
- 表中存在主键、唯一键的情况下,分区键的字段必须为主键或唯一键的部分或全部字段。
在 MySQL 中总共支持六种分区类型:range、list、hash、key、sub、columns。
RANGE
按照一个字段范围进行分区,仅支持整数类型字段作为分区键,如果想要以日期字段来做数据分区,需要想将其转换为整数格式的时间戳。
partition by range(r_id)(
partition p1 values less than (100000),
partition p2 values less than (200000)