function reg($email){
$email = mysql_escape_string( $email); //用户名是E-mail
$crc32 = sprintf("%u", crc32( $email)); //散列计算表名
$mod = $crc32 % 5 + 1; //散列至5个表.mid至少为1

$query = "SET @@auto_increment_increment=5,@@auto_increment_offset=$mod"; //关键,设置该表的mid起始位置和偏移值
db()->query( $query);

$query = "INSERT INTO member{$mod} SET email='$email'";
db()->query( $query);
$mid = db()->insertID();$query = "SET @@auto_increment_increment=1,@@auto_increment_offset=1"; //还原默认值
db()->query( $query);
创建表:create table member1 {mid, email, autoincrement=mid, unique=email};
create table member2 like member1;
create table member3 like member1;
create table member4 like member1;
create table member5 like member1;
这样执行下来,member1的mid值类似: 1,6,11,16...
member2的mid值类似: 2,7,12,17...这样做应该可行.但是如果以前只分了5个表,现在要分10个表,所有的数据就都乱了,不知是否有解决方案

解决方案 »

  1.   

    还没做过这么大量用户的应用,不过感觉还是按ID段分表多少好点,虽然这个分表在负载上均衡不错,但是分10表前面数据就不好操作了根据$mod提取$mod+5的ID录入member{$mod+5}的表名?
      

  2.   

    用户刚注册,还没有ID,怎么知道他的ID段呢
      

  3.   

    可以在创建用户后,creat语句成功后,做一些事的
      

  4.   


    执行完sql 可以通过这个函数 mysql_insert_id获取你要的.
      

  5.   


    呵呵,现在是不能先插入再获取ID的,如果先插入再获取ID,那就是所有用户都跑一个表里了
      

  6.   


    比如 [email protected] 这个用户现在在第一个表,用户ID是1
    加表导数据后,按照散列 [email protected] 在第5个表了,但用户ID维持1不变按照老版的,查用户ID为1的信息会跑到第一个表查,但现在就不是这样,根据用户ID是确定不了在哪个表的
      

  7.   

    当用户表增加后,你需要将已有的用户重新分配到各个表中
    即在遍历原来的所有表,对每一条记录检查是否需要改变表,如需要则将该记录插入目的表并在原表中删除
    你可以用原算法(当然分表数要是增加后的表数)获得表名;也可以通过id计算出新表名关键在于,为了保证 id 不会因插入而改变,你需要在执行插入操作前先执行
    SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO"切,切!!!