首页 >

mysql先分了10张表,后续在分表如何处理? |zabbix mysql高可用

多个mysql启动进程,mysql输入汉字报错,怎么用指令开mysql,mysql jdbc 创建存储过程,mysql订单怎么查询,zabbix mysql高可用mysql先分了10张表,后续在分表如何处理? |zabbix mysql高可用

但是当数据量进一步增多的时候,单库的数据量达到了一定的级别之后,那么就需要分更多的表,那么这时候有哪些处理方案呢?

做数据迁移

最简单暴力,也是最麻烦的一个方案。

因为当分表(分库)数量增多的时候,因为分片规则的变化,每个表的数据都要被重新分配到多个新的表;这种方法虽然最直接,但是带来的问题也非常大:

  • 数据迁移时间会比较长,需要迁移时间;

  • 如果业务不能停的话(在线迁移),还要解决增量数据和历史数据一致性的问题;

不做数据迁移

那么有没有方法,当数据增长到现有分表极限的时候,加表或者加库的时候,可以避免数据的迁移呢?说白了,大家需要增加分表算法的复杂性,让算法可以兼容增加分表前后的数据路由:

  • 先说一个简单的办法,(为了方便讲述,下面就把id当做分表字段),如果id是一个增长的全局序列,每个表存500万的数据,那么可以id=1-500万存到table_1,id=500万零1-1000万存到table_2,理论上这种方法是可以无限扩容的,但是问题也显而易见,就是每个阶段的数据insert会集中在一个表/库上,虽然能避免数据迁移的问题,但是数据热点的问题没有解决。

  • 如果id是一个增长的全局序列,当前有十张表,那么分表的算法为:id%10,根据0-9路由到10个表中;当表扩到20张的时候,扩容那一刻取max_id,那么未来分库的算法也就变成了:
if(id<max_id){id%10}else{id%20};
  • 有些分表的算法本身就带时间戳,可以基于id中的时间戳来实现,比如Twitter-Snowflake算法,这个算法是一个64位的Long值,前42位就是一个精确到毫秒的时间戳,那么大家的分库算法也就可以以某个时间点来判断:

if(id中的时间<增加分表那一刻的时间){id%10}else{id%20};

偶将持续分享Java开发、架构设计、程序员职业发展等方面的见解,希望能得到你的关注。


mysql先分了10张表,后续在分表如何处理? |zabbix mysql高可用
  • 面对“大数据杀熟”等乱象,我们需要什么样的“算法”? - 网络|
  • 面对“大数据杀熟”等乱象,我们需要什么样的“算法”? - 网络| | 面对“大数据杀熟”等乱象,我们需要什么样的“算法”? - 网络| ...

    mysql先分了10张表,后续在分表如何处理? |zabbix mysql高可用
  • 篮球的高阶数据有哪些,具体是怎么分析的? - 网络|
  • 篮球的高阶数据有哪些,具体是怎么分析的? - 网络| | 篮球的高阶数据有哪些,具体是怎么分析的? - 网络| ...

    mysql先分了10张表,后续在分表如何处理? |zabbix mysql高可用
  • 数学基础非常差,但编写代码能力强,有哪些IT岗位可以选择? - 网络|
  • 数学基础非常差,但编写代码能力强,有哪些IT岗位可以选择? - 网络| | 数学基础非常差,但编写代码能力强,有哪些IT岗位可以选择? - 网络| ...