当前位置: 首页 > 图灵资讯 > java面试题> javaMySQL面试题-如何进行分库分表

javaMySQL面试题-如何进行分库分表

来源:图灵教育
时间:2024-05-29 13:18:51

分表用户id进行分表,每个表控制在300万数据。

分库根据业务场景和地域分库,每个库并发不超过2000

Sharding-jdbc 这种 client 层方案的优点在于不用部署,运维成本低,不需要代理层的二次转发请求,性能很高,但是各个系统都需要耦合 Sharding-jdbc 的依赖,升级比较麻烦

Mycat 这种 proxy 层方案的缺点在于需要部署,自己运维一套中间件,运维成本高,但是好处在于对于各个项目是透明的,如果遇到升级之类的都是自己中间件那里搞就行了

水平拆分:一个表放到多个库,分担高并发,加快查询速度

●id保证业务在关联多张表时可以在同一库上操作

●range方便扩容和数据统计

●hash可以使得数据更加平均

垂直拆分:一个表拆成多个表,可以将一些冷数据拆分到冗余库中

不是写瓶颈优先进行分表

●分库数据间的数据无法再通过数据库直接查询了。会产生深分页的问题

●分库越多,出现问题的可能性越大,维护成本也变得更高。

●分库后无法保障跨库间事务,只能借助其他中间件实现最终一致性。

分库首先需考虑满足业务最核心的场景:

1 订单数据按用户分库,可以提升用户的全流程体验

2 超级客户导致数据倾斜可以使用最细粒度唯一标识进行hash拆分

3 按照最细粒度如订单号拆分以后,数据库就无法进行单库排重了

三个问题:

●富查询:采用分库分表之后,如何满足跨越分库的查询?使用ES的宽表借助分库网关+分库业务虽然能够实现多维度查询的能力,但整体上性能不佳且对正常的写入请求有一定的影响。业界应对多维度实时查询的最常见方式便是借助 ElasticSearch;

●数据倾斜:数据分库基础上再进行分表;

●分布式事务:跨多库的修改及多个微服务间的写操作导致的分布式事务问题?

●深分页问题:按游标查询,或者叫每次查询都带上上一次查询经过排序后的最大 ID;