mysql什么分表?以及我什么知道该去哪个表取数据?

回复列表(157|隐藏机器人聊天)
  • @Ta / 2022-06-25 / /

    @大尨,为什么难受,你在找到表的名称后不就可以去查询了吗,只是变成

    
    Db::table('ulogs'.(crc32("$uid;$type;$wxid") % $表的数量))->where('uid',$uid)->where('type',$type)->where('wxid',$wxid)->first();
    

    而已,哪里难受?

  • @Ta / 2022-06-25 / /
    @老虎会游泳,查询数据的时候很会忽略 $type;$wxid 这样的话还得设置用户必须选择 type 跟 wxid 来查询,用户可能不来这一套,他大多数只会一个列表界面显示。
  • @Ta / 2022-06-25 / /

    @大尨,如果你有执行where uid=?的需求,那可以这样分表:

    Db::table('ulogs'.($uid % $表的数量))->where('uid',$uid)->get();
    
    Db::table('ulogs'.($uid % $表的数量))->where('uid',$uid)->where('type',$type)->where('wxid',$wxid)->first();
    
  • @Ta / 2022-06-25 / /

    @大尨,选择始终会存在的那个查询条件作为分表参数。

    如果参数是字符串,或者不连续的整数,可以考虑套一层crc32()来让分配更均匀。

    Db::table('ulogs'.(crc32($uid) % $表的数量))->where('uid',$uid)->get();
    
    Db::table('ulogs'.(crc32($uid) % $表的数量))->where('uid',$uid)->where('type',$type)->where('wxid',$wxid)->first();
    
  • @Ta / 2022-06-25 / /
    @老虎会游泳,好像可以这样试试看看。
  • @Ta / 2022-06-25 / /

    @大尨,MySQL也能算CRC32和取模,所以数据的初始导入工作可以交给MySQL来做。

    INSERT INTO ulogs0 SELECT ulogs WHERE CRC32(uid) % 10 = 0;
    INSERT INTO ulogs1 SELECT ulogs WHERE CRC32(uid) % 10 = 1;
    ...
    

    以后如果要改散列函数,也能用上述方法批量转移数据。


    Screenshot_20220625_234228_com.UCMobile.jpg

  • @Ta / 2022-06-25 / /
    @老虎会游泳,好的
  • @Ta / 2022-06-26 / /

    @大尨,更正:PHP中,负数取模的值为负数。只有python中负数取模才得到正数。

    不过,在64位系统中所有crc32()的结果都将是正整数,所以应该不成问题。MySQL的CRC32函数应该也不会返回负值。

  • @Ta / 2022-06-26 / /

    套CRC32让数据分布更均匀的例子:

    Screenshot_20220626_000330_com.UCMobile.jpg


    不套CRC,数据就变得不太均匀了,因为虎绿林的偶数uid比奇数多很多(当时开了数据库主从同步,id自增为2)。为什么套ABS,因为虎绿林有负数UID(@所有人),MySQL负数取模也为负。

    Screenshot_20220626_000448_com.UCMobile.jpg

  • @Ta / 2022-06-26 / /

    @大尨@老虎会游泳,数据库新手,不懂想请教:

    对于B表:

    如果不分表,性能会急剧下降吗?

    只是因为B+树层数多一层?(即,每次查询随机读两次硬盘(假设索引的B+树层数也多一层))

  • @Ta / 2022-06-26 / /
    @无名啊,数据到300w查询效果下降就比较明显了。所以表是要分的。
  • @Ta / 2022-06-26 / /
    1656241745670.jpg
  • @Ta / 2022-06-26 / /

    @大尨,好奇B表extend字段平均长度有多少。。1KB?

    wxidappid呢?各20字节?

  • @Ta / 2022-06-26 / /
    @无名啊,wxid和appid都是 varchar(32) extend 是  text 
  • @Ta / 2022-06-26 / /
    @无名啊这个类型不是看数据随便设置的吗?还需要注意这些细节?
  • @Ta / 2022-06-26 / /

    @大尨,实际平均占用空间呢?

    才300W就卡了,感觉至少extend很长

  • @Ta / 2022-06-26 / /
    @无名啊,不长,实际都不到4096的长度,只是为了方便直接 text类型
  • @Ta / 2022-06-26 / /
    @无名啊,因为这个搜索频率挺大的。不断的搜
  • @Ta / 2022-06-26 / /

    @大尨@老虎会游泳,你们会去了解这种东西吗?

    一个查询大概会随机读几次硬盘?

    如果不是,那计算什么东西来大致了解“这个查询性能如何”?

  • @Ta / 2022-06-26 / /

    @无名啊,计时啊,结束时间-开始时间。

添加新回复
回复需要登录