MySQL分表
MySQL分表
私人暖炉 发表于3个月前
MySQL分表
  • 发表于 3个月前
  • 阅读 1
  • 收藏 0
  • 点赞 0
  • 评论 0

腾讯云 十分钟定制你的第一个小程序>>>   

假设现在有一个应用系统可能会有100亿的用户量,另外一个表一般存储量在不超过100万的时候基本能保持良好性能,计算下来,我们需要1万张表,即分表为1万个表。

例如原表是sina_userinformation,包含字段有id,name,sex,address.........。首先需要创建s_userinformation1-100000.

DROP table IF EXISTS s_userinformation1;
create table s_userinformation1(
    id bigint primary key auto_increment ,
    name varchar(20),
    sex tinyint not null default '0',
    ....
)ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;

创建剩余表可以写一个脚本 ,其中用   "create table s_userinformation".$num."like s_userinformation1;" 语句来创建其余的表

最后创建总表

DROP table IF EXISTS s_userinformation;
create table s_userinformation(
id bigint primary key auto_increment ,
name varchar(20),
sex tinyint not null default '0',

..........
)ENGINE=MERGE UNION=(tb_member1,tb_member2,........) INSERT_METHOD=LAST CHARSET=utf8 AUTO_INCREMENT=1 ;

接下来分数据到每个表中 “insert into tb_member".$i."(id,name,sex...........) select id,name,sex....... from sina_userinfomation where id%".$count."=".$i-1.";"

//查询数据

解释一下:($id >> 20)表示将向右移位20位,(向右移动一位标示减少一半),printf('%d',$data)标示将数据按照十进制输出。

               即id为1~1048575(2的20次幂-1)时均访问user_0,1048576~2097152时访问user_1,以此类推.....

那么问题来了,如果用户更多怎么办,现在需要一个可扩展的方法:

function getTable($id,$bit,$seed){

   return 'user_'.sprintf('%0{$bit}d',($id >> $seed));

}

其中:$id为用户id,$bit标示表后缀的位数,$seed表示要移位的位数即:单个表能存储的记录条数。

这样就可以任意分表了。

共有 人打赏支持
粉丝 2
博文 18
码字总数 2771
×
私人暖炉
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: