分库分表

​ 并发量决定是否需要分库,

​ 数据量决定是否需要分表。

分区分片

​ 按时间范围归档分区

​ 按用户ID取模分表,

​ 按shardingkey来分片;

数据量太大的场景

mysql表的数据量一般控制在千万级别,如果再大的话,就要考虑分库分表。

除了分表外,列举了面对海量数据业务的一些常见优化手段

  • 缓存加速
  • 读写分离
  • 垂直拆分
  • 分库分表
  • 冷热数据分离
  • ES助力复杂搜索
  • NoSQL
  • NewSQL

分表后ID如何保证全局唯一

分库分表后,多张表共用一套全局id,原来单表主键自增方式满足不了要求。

我们需要重新设计一套id生成器。

特点:全局唯一、高性能、高可用、方便接入。

  • UUID
  • 数据库自增ID
  • 数据库的号段模式,每个业务定义起始值、步长,一次拉取多个id号码
  • 基于Redis,通过incr命令实现ID的原子性自增。
  • 雪花算法(Snowflake)
  • 市面的一些开源框架,如:百度(uid-generator),美团(Leaf), 滴滴(Tinyid)等

分表后可能遇到的问题

分表后,与单表的最大区别是有分表键sharding_key,用来路由具体的物理表,以电商为例,有买家和卖家两个维度,以buyer_id路由,无法满足卖家的需求,反之同样道理。如何解决?

  • 分买家库和卖家库,将买家库做为写库,保存完整的数据关系。同时将数据异构同步一份到卖家库,卖家库可以只存储seller_id,order_id,buyer_id 等几个简单关系字段即可,以seller_id作为分表键
  • 多线程扫描,分段查找,然后再聚合结果
  • 另外也可以存到ES中,支持多维度复杂搜索