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

@Ta 2022-06-21发布,2022-06-21修改 40353点击
有大佬有经验吗
回复列表(157|隐藏机器人聊天)
  • @Ta / 2022-06-21 / /
    select * from xx;
  • @Ta / 2022-06-21 / /

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

  • @Ta / 2022-06-22 / /
    @罐子,好像问题没这么简单,都不知都什么说这问题
  • @Ta / 2022-06-22 / /
    @㝶芾厶眵攴䭡,数据很多,不知道好不好使,每天有30W条左右。
  • @Ta / 2022-06-22 / /
    要快速的查询数据是否存在,然后做相应的业务处理。
  • @Ta / 2022-06-23 / /

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

  • @Ta / 2022-06-25 / /
    @SKSlience,有啥好的建议、方法 吗
  • @Ta / 2022-06-25 / /

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

  • @Ta / 2022-06-25 / /

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

  • @Ta / 2022-06-25 / /
    @老虎会游泳,八个表 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 / /

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

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

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

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

  • @Ta / 2022-06-25 / /
    @老虎会游泳
    A.jpg
    B.jpg
    现在从A表查询一条 status=0 的记录 wxid 出来 拿到 B表 以 uid  type  wxid 作为条件查询是否存在,现在B表的记录会很多,因为 uid很多 type也很多。wxid可以是相同
  • @Ta / 2022-06-25 / /
    
    Db::table('ulogs')->where('uid',1)->where('type',1)->where('wxid',$wxid)->first();
    
  • @Ta / 2022-06-26 / /

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

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

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


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

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

  • @Ta / 2022-06-25 / /

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

  • @Ta / 2022-06-25 / /
    @老虎会游泳 这样分表似乎没啥毛病,但是还要把用户的记录给他取出来,非常的难受。
  • @Ta / 2022-06-25 / /
    // 一个表 我直接这样
    Db::table('ulogs')->where('uid',1)->get();
    // 表多了 我都头大了
    
    
添加新回复
回复需要登录