分库分表

56 阅读2分钟

image.png 分库分表:分库可以提升IO性能,扩展连接数;分表可以提高查询性能

image.png

常见的分库分表策略:

  • 取模均匀分
  • 按照范围分
  • 根据业务场景分

动态扩缩容的方式

分库分表的中间件:

  • ShardingSphere:Apache的分库分表组件,支持的策略

    • inline策略:根据单一分片键进行精确分片,不支持范围查询
    • Standard策略:根据单一分片键进行精确和范围分片。支持between
    • Complex策略:根据多个分片键进行精准和范围查询
    • Hint策略:使用和SQL无关的方式进行分片查询

全分片查询时效率最低的,也就是会把所有的分库分表都查询一遍

动态切换数据源和查询分库分表策略的区别?

  • 动态切换数据源和SQL无关。根据指定的内容明确查询的库表
  • 查询分库分表策略是根据SQL和策略来判断查询某一个库表

分库分表常见问题:

  • 想要根据非分片键进行查询怎么办:基因法多分片查询。使用userId + 其他查询键,两个之间建立关联关系。但是限制就是只能两个字段
  • 如果想要根据多个非分片键进行查询怎么办:根据键建立对应关系。比如username,库id、表id。建立倒排索引

分布式唯一主键方案(生成一个全局唯一的ID)

  • 使用redis的incr
  • 雪花算法snowflake:
    • 总共生成64位的数,第一位空置;接下来41位是当前机器生成的机器时间戳(有可能不准。时间回拨问题);接下来10位是机器id;最后12位是序列号
    • 时间回拨解决方式:判断上次与本次的时间差。可以直接进行sleep

image.png

  • UUID:UUID.randomUUID().toString().repalaceAll("-", "")
    • ①、生成的主键是字符串的,如果作为主键使用的话,B+树的排序、范围查询的比较效率就很低;
    • ②、也不保证严格递增

读写分离

  • 主库负责写;从库负责读

image.png