MySQL分库分表
分库分表
分库分表是一种常见的数据分片方式,它不同于集群那种完全的备份数据,而是每个数据库或者每张表只存储整个数据的一部分,这样可以保证总数据量不变的情况下,每个数据库和每张表少存储一些数据。
而且在数据写入时,也会变为往一个库或者一张表写变为往多个库或者多张表写,提高并发写入能力。
如何对数据库做垂直拆分
垂直拆分就是对数据库竖着拆分,也就是将数据库的表拆分到多个不同的数据库中。
垂直拆分的原则一般是按照业务类型来拆分,核心思想是专库专用,将业务耦合度比较高的表拆分到单独的库中。
如何对数据库做水平拆分
水平拆分指的是将单一数据表按照某一种规则拆分到多个数据库和多个数据表中,关注点在数据的特点。
拆分规则
1、按照某一个字段的哈希值做拆分,这种拆分规则比较适用于实体表。
比如说我们想把用户表拆分成 16 个库,每个库是 64 张表,那么可以先对用户 ID 做哈希,哈希的目的是将 ID 尽量打散,然后再对 16 取余,这样就得到了分库后的索引值;对 64 取余,就得到了分表后的索引值。

2、按照某一个字段的区间来拆分,比较常用的是时间字段。

分库分表带来的问题
分库分表引入的一个最大的问题就是引入了分库分表键,也叫做分区键,也就是我们对数据库做分库分表所依据的字段。
这也就要求我们后续所有的查询都要带上分区或者分库所用的字段,否则就要遍历所有的库。
一个解决办法就是,我们可以建立一个其他字段和分区字段的映射,当需要根据其他字段查找时,我们先找到它所对应的id,然后再根据id来查询这个具体的值。
另一方面,我们无法通过join来连接两个库的表,只能查询到后端然后进行处理。
参考
《高并发系统设计 40 问》