已掉线,重新登录

首页 > 绿虎论坛 > 历史版块 > 编程 > PHP > 讨论/求助

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

作者: @Ta

时间: 2022-06-21发布,2022-06-21修改

点击: 40344

有大佬有经验吗

[隐藏样式|查看源码]


『回复列表(157|隐藏机器人聊天)』

1. select * from xx;
(/@Ta/2022-06-21 19:07//)

2.

关键词: 纵向&横向
~~~

(/@Ta/2022-06-21 19:15//)

3. @罐子,好像问题没这么简单,都不知都什么说这问题
(/@Ta/2022-06-22 19:39//)

4. @㝶芾厶眵攴䭡,数据很多,不知道好不好使,每天有30W条左右。
(/@Ta/2022-06-22 19:40//)

5. 要快速的查询数据是否存在,然后做相应的业务处理。
(/@Ta/2022-06-22 19:41//)

6.

就是分库分表嘛,简单的。你每天30万,目测分表不够吧
努力~奋斗~

(/@Ta/2022-06-23 19:31//)

7. @SKSlience,有啥好的建议、方法 吗
(/@Ta/2022-06-25 02:14//)

8.

什么=怎么吗?没脑洞看不懂标题啊

(/@Ta/2022-06-25 09:30//)

9.

@大尨,最简单的方案可能是,对主键进行散列,根据散列的结果来确定存放在哪个表。但这样就只能根据主键来检索数据是否存在了。
然后就是散列算法。对于数字主键,最简单的算法就是除N取模。比如分8个表,就id % 8,得0到7,分别放进表0到表7。

(/@Ta/2022-06-25 21:06//)

10. @老虎会游泳,八个表 id % 8,id=1或2或3 的 ,本身就能产生很大的数据。

我这个业务场景大概这样:


现在有2个表;

A表:有 id 等一些字段,数据量30来万不会增加多少。
B表:就是数据量很大的表,得分表什么的。B1 - B8 表。可以说是个日志表。

业务:

用户 uid=1&type=1 请求进来先去 A 表查询符合条件的数据取一条。type是1-10000 每个值就是不同的业务类型。

再拿这条数据去 B 表 查询这个业务跟这条记录是否存在。存在就重新取一条数据继续判断。不存在就添加进B表做记录,下次做判断使用。



可能我自己也描述的不是很明白。大体就是我要什么快速判断这个记录是否存在。。。。

(/@Ta/2022-06-25 22:03//)

11.

@大尨,根据id就能找到该去哪个表查询啊。

比如散列函数是 id % 100(所以有100张表,0到99)。
id是18308
18308 % 100 = 8
所以应该去查询表8。
这条记录一定会写入表8,如果在表8查不到,说明不存在。

(/@Ta/2022-06-25 22:32//)

12. @老虎会游泳 我还得把uid=1用户的这些记录给他展现出来看 我什么查 
(/@Ta/2022-06-25 22:34//)

13.

@大尨,你可以展示你查询B表的查询语句吗,特别是where部分

(/@Ta/2022-06-25 22:38//)

14. @老虎会游泳
A.jpg
B.jpg
现在从A表查询一条 status=0 的记录 wxid 出来 拿到 B表 以 uid  type  wxid 作为条件查询是否存在,现在B表的记录会很多,因为 uid很多 type也很多。wxid可以是相同
(/@Ta/2022-06-25 22:54//)

15.

Db::table('ulogs')->where('uid',1)->where('type',1)->where('wxid',$wxid)->first();
(/@Ta/2022-06-25 22:57//)

16.

@大尨,我会考虑用如下散列函数分表

crc32("$uid;$type;$wxid") % $表的数量

crc32输入字符串,输出整数,可能为负,但负数取模的值依然是正数或0,所以应该没问题。


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

不过,在64位系统中所有crc32()的结果都将是正整数,所以应该不成问题。

(/@Ta/2022-06-26 00:00//)

17.

@大尨,当然,一但选定分表方式,以后查询条件和表的数量就不能改了。所以它不具备可扩展性。

(/@Ta/2022-06-25 23:19//)

18. @老虎会游泳 这样分表似乎没啥毛病,但是还要把用户的记录给他取出来,非常的难受。
(/@Ta/2022-06-25 23:20//)

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

(/@Ta/2022-06-25 23:22//)

下一页 1/8页,共157楼

回复需要登录

6月29日 04:18 星期天

本站由hu60wap6驱动

备案号: 京ICP备18041936号-1