MySQL拓展(extend)

一、分区表的原理

对用户来说,分区表是一个独立的逻辑表,但是底层mysql将其分成了多个物理的子表,这对用户来说是透明的,每一个分区表都会使用一个独立的表文件。

原理:

创建表的时候通过partition by子句定义每个分区存放的数据,执行查询的时候,优化器会根据分区定义过滤那些没有我们需要数据的分区,这样查询只查询所需的数据所在分区

分区的主要目的是将数据按照一个比较粗的粒度分在不同的表中,这样可以将相关的数据存放在一起,而且要一次删除整个分区也十分方便

适用场景
  1. 表非常大,无法全部存在内存,或者只在表的最后有热点数据,其他都是历史数据
  2. 分区表的数据更易维护,可以对独立的分区进行独立的操作
  3. 分区表的数据可以分布在不同的机器上,从而高效的使用资源

二、分库分表的原理

通过一些HASH算法或者工具将一张数据表垂直或者水平的进行物理切分

适用场景
  1. 单表数据达到百万甚至千万的级别
  2. 解决表锁的问题

水平分割

此时表很大,分割后可以降低在查询时需要读的数据和索引的页数,同时也降低了索引的层数,提高查询效率

适用场景:
  1. 表中的数据有独立性,例如表中记录各个地区或各个时间段的数据,有些数据常用,有些数据不常用
  2. 需要把数据存放在多个介质上
缺点:
  1. 给应用增加复杂度,通常查询需要多个表名,查询所有的数据都需要union操作

垂直分表

将主键和一些列放在一张表,然后把主键和其他列放在另外一张表

使用场景:
  1. 表中一些列常用,一些列不常用
  2. 可以使数据行变小,一个数据页能存储更多的数据,减少查询I/O次数
缺点:
  1. 管理冗余列,查询所有的数据都需要join操作
坚持原创技术分享,您的支持将鼓励我继续创作!