20.
@大尨,为什么难受,你在找到表的名称后不就可以去查询了吗,只是变成
Db::table('ulogs'.(crc32("$uid;$type;$wxid") % $表的数量))->where('uid',$uid)->where('type',$type)->where('wxid',$wxid)->first();
而已,哪里难受?
21.
@老虎会游泳,查询数据的时候很会忽略 $type;$wxid 这样的话还得设置用户必须选择 type 跟 wxid 来查询,用户可能不来这一套,他大多数只会一个列表界面显示。
22.
@大尨,如果你有执行where uid=?
的需求,那可以这样分表:
Db::table('ulogs'.($uid % $表的数量))->where('uid',$uid)->get();
Db::table('ulogs'.($uid % $表的数量))->where('uid',$uid)->where('type',$type)->where('wxid',$wxid)->first();
23.
@大尨,选择始终会存在的那个查询条件作为分表参数。
如果参数是字符串,或者不连续的整数,可以考虑套一层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();
25.
@大尨,MySQL也能算CRC32和取模,所以数据的初始导入工作可以交给MySQL来做。
INSERT INTO ulogs0 SELECT ulogs WHERE CRC32(uid) % 10 = 0;
INSERT INTO ulogs1 SELECT ulogs WHERE CRC32(uid) % 10 = 1;
...
以后如果要改散列函数,也能用上述方法批量转移数据。

27.
@大尨,更正:PHP中,负数取模的值为负数。只有python中负数取模才得到正数。
不过,在64位系统中所有crc32()的结果都将是正整数,所以应该不成问题。MySQL的CRC32函数应该也不会返回负值。
28.
套CRC32让数据分布更均匀的例子:

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

29.
@大尨,@老虎会游泳,数据库新手,不懂想请教:
对于B表:
如果不分表,性能会急剧下降吗?
只是因为B+树层数多一层?(即,每次查询多随机读两次硬盘(假设索引的B+树层数也多一层))
30.
@无名啊,数据到300w查询效果下降就比较明显了。所以表是要分的。
32.
@大尨,好奇B表extend
字段平均长度有多少。。1KB?
wxid
和appid
呢?各20字节?
33.
@无名啊,wxid和appid都是 varchar(32) extend 是 text
35.
@无名啊,


这个类型不是看数据随便设置的吗?还需要注意这些细节?

37.
@无名啊,不长,实际都不到4096的长度,只是为了方便直接 text类型
39.
@大尨,@老虎会游泳,你们会去了解这种东西吗?
一个查询大概会随机读几次硬盘?
如果不是,那计算什么东西来大致了解“这个查询性能如何”?