5. 要快速的查询数据是否存在,然后做相应的业务处理。
6.
就是分库分表嘛,简单的。你每天30万,目测分表不够吧
努力~奋斗~
9.
@大尨,最简单的方案可能是,对主键进行散列,根据散列的结果来确定存放在哪个表。但这样就只能根据主键来检索数据是否存在了。
然后就是散列算法。对于数字主键,最简单的算法就是除N取模。比如分8个表,就id % 8
,得0到7,分别放进表0到表7。
10.
@老虎会游泳,八个表 id % 8,id=1或2或3 的 ,本身就能产生很大的数据。
我这个业务场景大概这样:
现在有2个表;
A表:有 id 等一些字段,数据量30来万不会增加多少。
B表:就是数据量很大的表,得分表什么的。B1 - B8 表。可以说是个日志表。
业务:
用户 uid=1&type=1 请求进来先去 A 表查询符合条件的数据取一条。type是1-10000 每个值就是不同的业务类型。
再拿这条数据去 B 表 查询这个业务跟这条记录是否存在。存在就重新取一条数据继续判断。不存在就添加进B表做记录,下次做判断使用。
可能我自己也描述的不是很明白。大体就是我要什么快速判断这个记录是否存在。。。。

11.
@大尨,根据id就能找到该去哪个表查询啊。
比如散列函数是 id % 100(所以有100张表,0到99)。
id是18308
18308 % 100 = 8
所以应该去查询表8。
这条记录一定会写入表8,如果在表8查不到,说明不存在。
12.
@老虎会游泳,

我还得把uid=1用户的这些记录给他展现出来看 我什么查
13.
@大尨,你可以展示你查询B表的查询语句吗,特别是where部分
14.
@老虎会游泳,


现在从A表查询一条 status=0 的记录 wxid 出来 拿到 B表 以 uid type wxid 作为条件查询是否存在,现在B表的记录会很多,因为 uid很多 type也很多。wxid可以是相同

15.
Db::table('ulogs')->where('uid',1)->where('type',1)->where('wxid',$wxid)->first();
16.
@大尨,我会考虑用如下散列函数分表
crc32("$uid;$type;$wxid") % $表的数量
crc32输入字符串,输出整数,可能为负,但负数取模的值依然是正数或0,所以应该没问题。
更正:PHP中,负数取模的值为负数。只有python中负数取模才得到正数。
不过,在64位系统中所有crc32()
的结果都将是正整数,所以应该不成问题。
17.
@大尨,当然,一但选定分表方式,以后查询条件和表的数量就不能改了。所以它不具备可扩展性。
18.
@老虎会游泳,

这样分表似乎没啥毛病,但是还要把用户的记录给他取出来,非常的难受。

19.
// 一个表 我直接这样
Db::table('ulogs')->where('uid',1)->get();
// 表多了 我都头大了