切分方式
垂直切分
把单一的表拆分成多个表,并分散到不同的数据库(主机)上。一个数据库由很多表的构成,每个表对应着不同的业务,垂直切分是指按照业务将表进行分类,分布到不同的数据库上面,这样也就将数据或者说压力分担到不同的库上面。
水平切分
相对于垂直拆分,水平拆分不是将表做分类,而是按照某个字段的某种规则来分散到多个库之中,每个表中包含一部分数据。简单来说,我们可以将数据的水平切分理解为是按照数据行的切分,就是将表中的某些行切分到一个数据库,而另外的某些行又切分到其他的数据库中。
分库分表的核心思路就是将原本保存在单表中太大的数据进行拆分,将这些数据分散保存到多个数据库的多个表中,避免因为单表数据太大给数据库的访问带来的读写性能问题。
分片规则
- 按照 ID 求模,将数据分散到不同的数据库,具有相同数据用户的数据都被分散到一个库中。
- 按照日期,将不同月甚至日的数据分散到不同的库中。
- 按照某个特定的字段求摸,或者根据特定范围段分散到不同的库中。
执行过程
分片优化
- 合理的制定分片规则,将数据尽可能平均的拆分
- 通过索引或异构索引表,降低全表扫描频率
- 聚合数据量大、计算量大的数据,可以通过将数据迁移到HBase或ES等NoSQL来查询
异构索引表
异构索引表,即采用异步机制将原表内的每一次创建和更新,都换另一个维度保存一份完整的数据表或索引表。例如:应用在创建或更新一条按照订单ID为分库分表键的订单数据时,也会再保存一份按照买家ID为分库分表键的订单索引数据。这样当以用户ID为条件查询订单时,可有效的避免多库多表的全表扫描。
实现方式:
- 应用层通过异步的手段自己实现,容易引发分布式事务的问题
- 数据层通过中间件采用数据复制的方式实现,例如:canal