一、分区表的原理
对用户来说,分区表是一个独立的逻辑表,但是底层mysql将其分成了多个物理的子表,这对用户来说是透明的,每一个分区表都会使用一个独立的表文件。
原理:
创建表的时候通过partition by子句定义每个分区存放的数据,执行查询的时候,优化器会根据分区定义过滤那些没有我们需要数据的分区,这样查询只查询所需的数据所在分区
分区的主要目的是将数据按照一个比较粗的粒度分在不同的表中,这样可以将相关的数据存放在一起,而且要一次删除整个分区也十分方便
适用场景
- 表非常大,无法全部存在内存,或者只在表的最后有热点数据,其他都是历史数据
- 分区表的数据更易维护,可以对独立的分区进行独立的操作
- 分区表的数据可以分布在不同的机器上,从而高效的使用资源
二、分库分表的原理
通过一些HASH算法或者工具将一张数据表垂直或者水平的进行物理切分
适用场景
- 单表数据达到百万甚至千万的级别
- 解决表锁的问题
水平分割
此时表很大,分割后可以降低在查询时需要读的数据和索引的页数,同时也降低了索引的层数,提高查询效率
适用场景:
- 表中的数据有独立性,例如表中记录各个地区或各个时间段的数据,有些数据常用,有些数据不常用
- 需要把数据存放在多个介质上
缺点:
- 给应用增加复杂度,通常查询需要多个表名,查询所有的数据都需要union操作
垂直分表
将主键和一些列放在一张表,然后把主键和其他列放在另外一张表
使用场景:
- 表中一些列常用,一些列不常用
- 可以使数据行变小,一个数据页能存储更多的数据,减少查询I/O次数
缺点:
- 管理冗余列,查询所有的数据都需要join操作