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