按ID取模分表,如果表不够了要加表,你会怎么做?

想看看大家的意见

《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
最佳答案

看起来像是单库分表

  1. 假设还是在这个库上继续添加分表,那我会修改一下寻表公式,原有8张表,一张容量1000w,新建8张表,表名下标递增,寻表公式调整为 table_id%8+int(id/80000000)
  2. 分库,新建数据库,库里创建同样的表,需要先根据id选择db,取模获取表名公式不变
  3. 重新规划表的数量,处理数据到新表,然后切换连接到新表

1、2 工作量小一点,但数据倾斜
3 的话要处理老数据和注意切换过程的影响

2年前 评论
讨论数量: 8

基于 Snowflake 算法搭建发号器,保证分库分表后ID的全局唯一性

2年前 评论
yzbfeng 2年前

根据业务增长而定吧 可以取模取大点 多几个表 或者直接用支持一致性hash的中间件去分表分库

2年前 评论
PHPer技术栈 2年前

水平扩展需要兼容原有的分表规则,可以统一分表的地方根据ID规则来缺失使用特定的散列函数,其实在设计的时候就应该考虑扩容

2年前 评论

假如第一次分表 1分5,再增加的时候,要按倍数增加,如10,15或20。要保证平衡分配。 而且这次要分的多一些,比如40,避免短时间内要进行第三次分表调整

2年前 评论

参考一下一致性哈希的实现

2年前 评论

我会用mysql 分片来做,至少逻辑上是一个表,另外按ID去分表是非常糟糕的设计,你无法合理利用索引,除了主键是ID,其他的查询方式你一点优势没有还提高了复杂,仅仅是让你的表多放了点东西,要让表多存东西方法多得是。

2年前 评论

看起来像是单库分表

  1. 假设还是在这个库上继续添加分表,那我会修改一下寻表公式,原有8张表,一张容量1000w,新建8张表,表名下标递增,寻表公式调整为 table_id%8+int(id/80000000)
  2. 分库,新建数据库,库里创建同样的表,需要先根据id选择db,取模获取表名公式不变
  3. 重新规划表的数量,处理数据到新表,然后切换连接到新表

1、2 工作量小一点,但数据倾斜
3 的话要处理老数据和注意切换过程的影响

2年前 评论

其实可以直接选择 对分布式支持更好的数据库 mysql毕竟比较老旧了

2年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!