分库分表是什么

将原本存储于单个数据库上的数据拆分到多个数据库,把原来存储在单张数据表的数据拆分到多张数据表中,实现数据切分,从而提升数据库性能。

为什么要分库分表

  • 分库的原因:QPS 过高,数据库响应速度来不及,一般 mysql 单机也就 1000 左右的 QPS,如果超过 1000,就要考虑分库;
  • 分表的原因:单表太大,复杂 SQL 的查询速度变慢,一般 mysql 单表也就 1000 万左右的量,如果超过 1000 万,就要考虑分表;

如何分库分表

分库分表的实现分为两种方式:垂直切分和水平切分

水平切分

将数据分散到多张表,涉及分区键的问题。

  • 分库:每个==库结构一样,数据不一样==,没有交集。库多了可以环节IO和CPU压力;
  • 分表:每个==表结构一样,数据不一样==,没有交集。表内数据量减少可以提高SQL执行效率、减轻CPU压力;
    • 把一个表按照某个字段,拆分到多个表里面,这个字段叫 sharding-key;

分区键(Sharding-Key)问题

方案一:可以用 id 的 hash 值取模,需要分多少个表,就取什么的模;

  • 这种方案的缺点是如果分表的数量变了的话,所有的数据都要重新迁移到不同的分表中;

方案二:可以用 id 的 hash 值取模,需要分多少个表,就取什么的模

  • 这种方案只需要把在之前的分表中的数据,现在需要放在新的分表的数据移动即可【哈希碰撞导致某些数据放在了之前的表中】。

方案三:根据时间范围来分表

  • 可以划分为 最近 3 个月内的数据距离现在 3-12 个月的数据距离现在 12 月之前的数据,这种分法可区分数据的冷热程度,对于热数据,加 redis 缓存访问来提高访问效率;对于 3-12 个月的数据,由于使用的少,可以放到 ES 或 hbase 或 mongoDB 里面;对于 12 月之前的数据,可以使用 hive 只支持离线统计,不支持纪录查询。
  • 也可以划分相同范围的时间,比如以一个月为范围划分,不断添加新的月度表。

这种方案的缺点是数据量并发还是都作用在同一张表上,无法提高同一张表的并发效率。

垂直切分

将字段拆分为多张表,需要一定重构

  • 分库:每个==库结构、数据都不一样==,所有库的并集为全量数据。
  • 分表:把一个表的多个字段分别拆成多个表,一般按字段的冷热拆分,热字段一个表,冷字段一个表。拆完以后,可以放在一个库,也可以放在多个库里。

原文/引用