对数据库进行分库分表可能会引发哪些问题?
对数据库进行分库分表可能会引发哪些问题?
回答重点
1)首先是事务的问题。
我们使用关系型数据库,有很大一点在于它保证事务的完整性。
而分库之后单机事务就用不上了,必须使用分布式事务来解决,而分布式事务相对而言就比较重了,而且大部分的分布式事务只能保证最终一致性,所以业务上会存在数据不一致的场景。
2)连表 JOIN 问题
在一个库中的时候我们还可以利用 JOIN 来连表查询,而跨库了之后就无法使用 JOIN 了。
此时的解决方案就是在业务代码中进行关联,也就是先把一个表的数据查出来,然后通过得到的结果再去查另一张表,然后利用代码来关联得到最终的结果。
这种方式实现起来稍微比较复杂,不过也是可以接受的。
还有可以适当的冗余一些字段。比如以前的表就存储一个关联 ID,但是业务时常要求返回对应的 Name 或者其他字段。这时候就可以把这些字段冗余到当前表中,来去除需要关联的操作。
或者通过宽表的形式查询,比如将数据全量存储至 ES 中,利用 ES 来查询数据。
3)全局 ID 唯一性问题
以前单库单表直接使用数据库的自增 ID 即可,但是分库分表之后,使用自增 ID 会导致重复主键的情况,此时需要利用雪花算法或者其他全局唯一 ID 发号器来生成唯一主键。
4)排序问题
单表直接通过 order by 进行排序即可,分库分表后直接利用数据库是无法实现排序的。要么利用分库分表中间件的能力进行汇总排序,要么自己在业务代码中排序,要么利用 ES 存储全量数据排序查询。
5)count 问题
其实和排序问题类似,单表可以直接 count,分库分表后无法支持,只能多表 count 然后业务代码中累加,或者单独搞一个地方来维护总数,要么还是利用 ES。
Comments