zhoutianyuan

Mysql Sharding

前言

  1)Sharding是按照一定规则重新分布数据的方式

  2)解决单机写入压力过大和容量问题

  3)  解决单机查询慢的问题

  4)本文主要根据用户登录场景分析

Sharding规则

  1)垂直拆分,一般是表中的字段比较多,按照业务分类拆分到不同的表中。

  2)水平拆分,一般是表中的数据量巨大,按照特定规则拆分到不同的表中。

    1. mod方式 

    例:网站有N种(手机号、邮箱、第三方...)登录方式   

function get_table_name($unique_name) {
    $tb_num = 8; // 表数量
    return \'login_\' . intval(sprintf(\'%u\', crc32($unique_name)) % $tb_num);
}
var_dump(get_table_name(\'username\'));//login_7

    优点:

      解决热点问题

    缺点:

      数据分布不平均。容易出现单表过大问题

      扩容时,需要重新迁移数据。

    2. range方式

    例:网站有N种(手机号、邮箱、第三方...)登录方式,每个表存1000W数据   

function get_table_name($unique_name) {
    $tb_split = 10000000; // 单表数据量
    return \'login_\' . intval(sprintf(\'%u\', crc32($unique_name)) / $tb_split);
}
var_dump(get_table_name(\'username\'));//login_416

    优点:

      不需要数据迁移

    缺点:

      数据分布不平均。出现很多表

    3. 暂时先使用range方式,先把$tb_split设置大一点。需要扩容时在重新迁移数据把$tb_split改小。

       

Sharding后

  1)设计方案时尽量避免数据迁移、热点问题。同时要保证易于水平扩展

  1)全局自增id方案

  2)跨库、跨表join

分类:

技术点:

相关文章:

  • 2021-09-25
  • 2021-07-09
猜你喜欢
  • 2021-06-22
  • 2021-09-27
  • 2021-07-27
  • 2021-11-20
相关资源
相似解决方案