分库分表简介

123 阅读2分钟

「这是我参与2022首次更文挑战的第6天,活动详情查看:2022首次更文挑战」。

读写分离分散了数据库读写的压力,但是没有分散存储的压力,如果数据量足够大,单个数据库就是性能的瓶颈。

  • 数据量过大读写性能会下降
  • 数据文件会很大,备份和恢复都需要很久
  • 数据文件大,极端情况下损失大

因此,我们需要做分库分表。

分库

通常我们按照业务模块将数据分散到不同的数据库,业务分库分散了单台服务数据库的压力,但是也引入了新的问题:

  • join 操作没法用了
  • 现在很多数据库支持事务,想要支持需要用分布式的事务解决方案,拖慢性能;或者用业务逻辑模拟事务功能,增加了复杂度
  • 增加了成本

分表

如果数据量进一步增大,到千万甚至亿级,那么这时候也要考虑对单表数据进行拆分。 分表有两种方式:垂直分表及水平分表。垂直分表就是将不同的列拆到不同的表里,水平就是拆行。 水平分表复杂度更高,主要体现在以下几方面:

  • 路由算法的选择上,常见的路有算法有:范围路由、hash 路由、配置路由等,需要根据自己的实际需求选择合适的路有算法
  • join、count 等操作需要对每个表进行操作后进行结果合并。其中 count 可以新增一个记录数表,记录每个表的数字,但是会增加复杂度;针对记录数表的操作与针对子表的操作没有办法放在一个事务中处理,可能会导致数据不一致。
  • orderby 操作复杂,需要借助业务代码或中间件实现

数据库分库分表听上去虽然好,但是不能盲目引入,因为会极大增加系统的复杂度,需要优先考虑更为简单的方式:如硬件优化、数据库调优、引入缓存层、程序优化等等,这些常规方式都不行再考虑分库分表。