分库分表拆常见分方法与特点
分片策略 |
数据分布 |
以后扩展 |
基于Hash:hash(分片键)%分片数 |
数据分布均匀 |
不易扩容,扩容需要数据迁移 |
范围分片:例如按年分,按月,按日 |
数据分表可能不均匀 |
易扩展,扩展不需要数据迁移 |
分库分表的常见问题与解决方式
如何确定最初需要多少张表?
一般考虑10年的数据量即可,如果是基于Hash,扩容需要再次迁移
分库之后Join如何处理?
如果是绑定表,即有关联的一组表,例如订单与订单详情表,使用同一个分库分表策略。
如果要join的表,是个字典表(表小,数据变动不大),建议做成广播表,所有的库都有存一份。
如果就是落在不同的库,例如订单,商品,可以采取 CQRS或者API Composition
用户分表了,某个用户手机号,找到用户信息?
加一张关联表, phone -> userId, 先根据phone 查找userId,之后根据userId ,查询订单表
分库分表后全局唯一ID如何生产?
- UUID,无序,写入性能差
- snowflake·: ShardingSphere提供这个算法, 有序,写入性能好,生成性能无上限。
- 利用Redis作为发号器: String 类型 key:yyyyMMddHHmmssSSS v