Mysql 分库、分表

Mysql Shardingsql

前言网站

  1)Sharding是按照必定规则从新分布数据的方式spa

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

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

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

Sharding规则get

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

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

    1. mod方式 table

    例:网站有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

相关文章
相关标签/搜索