方案

重点

  • 分表后,根据查询条件中的某个主要业务id,建立索引映射表
  • 查询条件放入到映射表中
  • 复杂查询可以通过ES解决
  • 一开始分表能多分就不能少分

    上亿数据量的用户表水平拆分

  • 将用户表拆分为100张表,users_001、users002等,将这100张表分散到两个数据库中

  • 根据userId进行拆分,根据userId字段hash后,对表进行取模,路由到一张表
  • 一般千万行数据量的表大小在1GB左右
  • 系统使用mycat、shardingsphere这类中间件,设置好路由规则,便可以对user表进行增删改

    存在问题

  • 用户登陆根据手机号登陆,如何查询用户

    • 常规方案:建一个映射表(mobile,userId)
  • 运营端,通常需要对用户进行条件复杂的搜索

    • 监听用户的binlog,将数据同步到ES中,然后使用ES进行搜索

      订单系统数据库设计

      分表规则

  • 根据orderId进行分表

  • 建立userId、orderId的映射表,然后以userId为粒度进行分表

    场景

  • 用户端,订单分页查询

    • userId进行hash然后对映射表表进行取模
    • 此时这个用户的订单肯定都在这一个表里
    • 然后分页查询出orderId
    • 然后会根据oderId到订单表取数据
  • 运营端
    • 将数据同步到ES中进行搜索