关键词: 纵向&横向 ~~~
就是分库分表嘛,简单的。你每天30万,目测分表不够吧 努力~奋斗~
什么=怎么吗?没脑洞看不懂标题啊
@大尨,最简单的方案可能是,对主键进行散列,根据散列的结果来确定存放在哪个表。但这样就只能根据主键来检索数据是否存在了。 然后就是散列算法。对于数字主键,最简单的算法就是除N取模。比如分8个表,就id % 8,得0到7,分别放进表0到表7。
id % 8
@大尨,根据id就能找到该去哪个表查询啊。
比如散列函数是 id % 100(所以有100张表,0到99)。 id是18308 18308 % 100 = 8 所以应该去查询表8。 这条记录一定会写入表8,如果在表8查不到,说明不存在。
@大尨,你可以展示你查询B表的查询语句吗,特别是where部分
Db::table('ulogs')->where('uid',1)->where('type',1)->where('wxid',$wxid)->first();
@大尨,我会考虑用如下散列函数分表
crc32("$uid;$type;$wxid") % $表的数量
crc32输入字符串,输出整数,可能为负,但负数取模的值依然是正数或0,所以应该没问题。
更正:PHP中,负数取模的值为负数。只有python中负数取模才得到正数。
不过,在64位系统中所有crc32()的结果都将是正整数,所以应该不成问题。
crc32()
@大尨,当然,一但选定分表方式,以后查询条件和表的数量就不能改了。所以它不具备可扩展性。
// 一个表 我直接这样 Db::table('ulogs')->where('uid',1)->get(); // 表多了 我都头大了
关键词: 纵向&横向
~~~
就是分库分表嘛,简单的。你每天30万,目测分表不够吧
努力~奋斗~
什么=怎么吗?没脑洞看不懂标题啊
@大尨,最简单的方案可能是,对主键进行散列,根据散列的结果来确定存放在哪个表。但这样就只能根据主键来检索数据是否存在了。
然后就是散列算法。对于数字主键,最简单的算法就是除N取模。比如分8个表,就
id % 8
,得0到7,分别放进表0到表7。我这个业务场景大概这样:
现在有2个表;
A表:有 id 等一些字段,数据量30来万不会增加多少。
B表:就是数据量很大的表,得分表什么的。B1 - B8 表。可以说是个日志表。
业务:
用户 uid=1&type=1 请求进来先去 A 表查询符合条件的数据取一条。type是1-10000 每个值就是不同的业务类型。
再拿这条数据去 B 表 查询这个业务跟这条记录是否存在。存在就重新取一条数据继续判断。不存在就添加进B表做记录,下次做判断使用。
可能我自己也描述的不是很明白。大体就是我要什么快速判断这个记录是否存在。。。。
@大尨,根据id就能找到该去哪个表查询啊。
比如散列函数是 id % 100(所以有100张表,0到99)。
id是18308
18308 % 100 = 8
所以应该去查询表8。
这条记录一定会写入表8,如果在表8查不到,说明不存在。
@大尨,你可以展示你查询B表的查询语句吗,特别是where部分
现在从A表查询一条 status=0 的记录 wxid 出来 拿到 B表 以 uid type wxid 作为条件查询是否存在,现在B表的记录会很多,因为 uid很多 type也很多。wxid可以是相同
@大尨,我会考虑用如下散列函数分表
crc32输入字符串,输出整数,可能为负,
但负数取模的值依然是正数或0,所以应该没问题。更正:PHP中,负数取模的值为负数。只有python中负数取模才得到正数。
不过,在64位系统中所有
crc32()
的结果都将是正整数,所以应该不成问题。@大尨,当然,一但选定分表方式,以后查询条件和表的数量就不能改了。所以它不具备可扩展性。