mysql数据库 | 分表和分区

分区和分表

1. 为什么要分区和分表?

当我们遇到海量数据存储在数据库中的某张表,此时单个表承受的压力是巨大的。
这不但会导致查询变慢,而且由于表的锁机制导致更新修改删除等操作也会受到严重影响(即使是行级锁也会有影响),因此便出现了数据库性能瓶颈。

2. 分表

分表是将一个大表按照一定的规则分解成多张具有独立存储空间的实体表,每个表都对应三个文件: MYD 数据文件,.MYI 索引文件,.frm 表结构文件。这些表可以分布在同一块磁盘上,也可以在不同的机器上。在应用访问数据库读写的时候根据事先定义好的规则得到对应的表名,然后去操作它。

将单个数据库表进行拆分,拆分成多个数据表,然后用户访问的时候,根据一定的算法(如用 hash 的方式,也可以用求余(取模)的方式),让用户访问不同的表,这样数据分散到多个数据表中,减少了单个数据表的访问压力。单表的并发能力提高了,磁盘I/O性能也提高了,提升了数据库访问性能。分表的目的就在于此,减小数据库的负担,缩短查询时间。


分表也分为了两种分表方式,分别为垂直切分和水平切分:

3.1 水平分表

通常情况下,我们使用 hash、取模等方式来进行表的拆分。
例如 : 当应用的用户量非常巨大,有一张100w的用户表,我们可以将它分成4张独立的一模一样的独立子表,每张表25w,然后我们通过一定的规则(例如hash、取模等)进行随机访问这三张表,这样就将一张表的压力分担到了三张表中,就类似于集群的处理方式。
(注意:此处的4张独立子表和原表是一模一样的,包括数据结构一样)

3.2 垂直分表

垂直拆分更多时候就应该在数据表设计之初就执行的步骤,垂直切分是指数据表列的拆分,把一张列比较多的表拆分为多张表。
通常,我们按以下原则进行垂直拆分:

  1. 把不常用的字段单独放在一张表;
  2. 把 text,blob(binary large object,二进制大对象)等大字段拆分出来放在附表中;
  3. 经常组合查询的列放在一张表中;

3. 分区

分区和分表相似,都是按照规则分解表。不同在于分表将大表分解为若干个独立的实体表,而分区是将数据分段划分在多个位置存放,分区后,表还是一张表,但数据分散到各个分散的位置了

但是分区通常比较不建议使用,因为在mysql规范中写到对分区表的缺点:分区表对分区键有严格要求;分区表在表变大后,执行DDL、SHARDING、单表恢复等都变得更加困难。因此禁止使用分区表,并建议业务端手动SHARDING。

猜你喜欢

转载自blog.csdn.net/weixin_40597409/article/details/115366221
今日推荐