假设现在有一个应用系统可能会有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表示要移位的位数即:单个表能存储的记录条数。
这样就可以任意分表了。