mysql什么分表?以及我什么知道该去哪个表取数据?
@大尨,为什么难受,你在找到表的名称后不就可以去查询了吗,只是变成
Db::table('ulogs'.(crc32("$uid;$type;$wxid") % $表的数量))->where('uid',$uid)->where('type',$type)->where('wxid',$wxid)->first();
而已,哪里难受?
@大尨,如果你有执行where uid=?的需求,那可以这样分表:
where uid=?
Db::table('ulogs'.($uid % $表的数量))->where('uid',$uid)->get(); Db::table('ulogs'.($uid % $表的数量))->where('uid',$uid)->where('type',$type)->where('wxid',$wxid)->first();
@大尨,选择始终会存在的那个查询条件作为分表参数。
如果参数是字符串,或者不连续的整数,可以考虑套一层crc32()来让分配更均匀。
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();
@大尨,MySQL也能算CRC32和取模,所以数据的初始导入工作可以交给MySQL来做。
INSERT INTO ulogs0 SELECT ulogs WHERE CRC32(uid) % 10 = 0; INSERT INTO ulogs1 SELECT ulogs WHERE CRC32(uid) % 10 = 1; ...
以后如果要改散列函数,也能用上述方法批量转移数据。
@大尨,更正:PHP中,负数取模的值为负数。只有python中负数取模才得到正数。
不过,在64位系统中所有crc32()的结果都将是正整数,所以应该不成问题。MySQL的CRC32函数应该也不会返回负值。
套CRC32让数据分布更均匀的例子:
不套CRC,数据就变得不太均匀了,因为虎绿林的偶数uid比奇数多很多(当时开了数据库主从同步,id自增为2)。为什么套ABS,因为虎绿林有负数UID(@所有人),MySQL负数取模也为负。
@大尨,@老虎会游泳,数据库新手,不懂想请教:
对于B表:
如果不分表,性能会急剧下降吗?
只是因为B+树层数多一层?(即,每次查询多随机读两次硬盘(假设索引的B+树层数也多一层))
@大尨,好奇B表extend字段平均长度有多少。。1KB?
extend
wxid和appid呢?各20字节?
wxid
appid
@大尨,实际平均占用空间呢?
才300W就卡了,感觉至少extend很长
@大尨,@老虎会游泳,你们会去了解这种东西吗?
一个查询大概会随机读几次硬盘?
如果不是,那计算什么东西来大致了解“这个查询性能如何”?
@无名啊,计时啊,结束时间-开始时间。
@大尨,为什么难受,你在找到表的名称后不就可以去查询了吗,只是变成
而已,哪里难受?