分库分表
分库分表是什么
将原本存储于单个数据库上的数据拆分到多个数据库,把原来存储在单张数据表的数据拆分到多张数据表中,实现数据切分,从而提升数据库性能。
为什么要分库分表
- 分库的原因: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 只支持离线统计,不支持纪录查询。
- 也可以划分相同范围的时间,比如以一个月为范围划分,不断添加新的月度表。
这种方案的缺点是数据量并发还是都作用在同一张表上,无法提高同一张表的并发效率。
垂直切分
将字段拆分为多张表,需要一定重构
- 分库:每个==库结构、数据都不一样==,所有库的并集为全量数据。
- 分表:把一个表的多个字段分别拆成多个表,一般按字段的冷热拆分,热字段一个表,冷字段一个表。拆完以后,可以放在一个库,也可以放在多个库里。
原文/引用
本文是原创文章,采用 CC BY-NC-ND 4.0 协议,完整转载请注明来自 程序员小航
评论
匿名评论
隐私政策
你无需删除空行,直接评论以获取最佳展示效果