分库分表:分库可以提升IO性能,扩展连接数;分表可以提高查询性能
常见的分库分表策略:
- 取模均匀分
- 按照范围分
- 根据业务场景分
动态扩缩容的方式
分库分表的中间件:
-
ShardingSphere:Apache的分库分表组件,支持的策略
- inline策略:根据单一分片键进行精确分片,不支持范围查询
- Standard策略:根据单一分片键进行精确和范围分片。支持between
- Complex策略:根据多个分片键进行精准和范围查询
- Hint策略:使用和SQL无关的方式进行分片查询
全分片查询时效率最低的,也就是会把所有的分库分表都查询一遍
动态切换数据源和查询分库分表策略的区别?
- 动态切换数据源和SQL无关。根据指定的内容明确查询的库表
- 查询分库分表策略是根据SQL和策略来判断查询某一个库表
分库分表常见问题:
- 想要根据非分片键进行查询怎么办:基因法多分片查询。使用userId + 其他查询键,两个之间建立关联关系。但是限制就是只能两个字段
- 如果想要根据多个非分片键进行查询怎么办:根据键建立对应关系。比如username,库id、表id。建立倒排索引
分布式唯一主键方案(生成一个全局唯一的ID)
- 使用redis的
incr - 雪花算法snowflake:
- 总共生成64位的数,第一位空置;接下来41位是当前机器生成的机器时间戳(有可能不准。时间回拨问题);接下来10位是机器id;最后12位是序列号
- 时间回拨解决方式:判断上次与本次的时间差。可以直接进行sleep
- UUID:
UUID.randomUUID().toString().repalaceAll("-", "")- ①、生成的主键是字符串的,如果作为主键使用的话,B+树的排序、范围查询的比较效率就很低;
- ②、也不保证严格递增
读写分离
- 主库负责写;从库负责读