一、 分库分表规则

会计系统按会计时间分库分表(一月一张表,一年一个库):

以center_entry_flow表为例:

arch_center_acct(database)

center_entry_flow 20170431之前

center_acct(database now)

center_entry_flow 20170501到20170631分录流水

center_entry_flow_201707 20170701到20170731分录流水

center_entry_flow_201708 20170801到20170831分录流水

...

center_acct_2018(database)

center_entry_flow_201801 20180101到20180131分录流水

center_entry_flow_201802 20180201到20180231分录流水

...

二、改造点:

1、分布式键生成方式

1.1、sharding-id:(类twitter的Snowflake)

其二进制表示形式包含四部分,从高位到低位分表为:1bit符号位(为0),41bit时间位,10bit工作进程位,12bit序列位。

eg:

78427487717031936

2305843009213694082

缺点:要设置工作进程位(10bit)

该标志在Java进程内是唯一的,如果是分布式应用部署应保证每个进程的工作进程Id是不同的。该值默认为0,目前可以通过三种方式设置。

调用静态方法CommonSelfIdGenerator.setWorkerId(“xxxx”)设置。

设置Java的系统变量,也就是再启动命令行中设置-Dsjdbc.self.id.generator.worker.id=xxx设置。

设置系统环境变量,通过SJDBC_SELF_ID_GENERATOR_WORKER_ID=xxx设置。

变通方式:workid通过hostname和IP生成

1.2、自定义表

表结构如下,实现方式:

最大ID存在数据库中,每次增加表中maxId值后获取id;出于效率原因,可以减少数据库访问次数,每次获取100个。

CREATE TABLE id_generator_table (

id int(11) DEFAULT NULL COMMENT '主键',

table_name varchar(255) DEFAULT NULL COMMENT '表名',

max_id int(11) DEFAULT NULL COMMENT '最大id'

) ENGINE=InnoDB DEFAULT CHARSET=utf8;

1.3、其它

Ticket Server(数据库生成方式)

这个是Flickr在遇到生成全局ID问题时采用的办法。利用了数据库中auto_increment的特性和MySQL特有的REPLACE INFO命令,专门一个数据库实例用来产生ID。

2、 修改不支持sql

参考sharding-jdbc官方文档,待整理

3、 幂待校验

月底24点切换表时,通过redis setIfNull 校验幂等

4、 sharding jdbc bug

4.1 多表查询时,统计数据条数时错误

类方法路径:

com.dangdang.ddframe.rdb.sharding.merger.ResultSetFactory#getResultSet

case SINGLE: return buildSingle(shardingResultSets);

改为

case SINGLE: return buildMultiple(shardingResultSets, mergeContext);

参考:

相关jar包

com.dangdang

sharding-jdbc-core

1.4.1

com.dangdang

sharding-jdbc-config-spring

1.4.1

分库分表后要进行SQL改写

改定分为两部分,一部分是将分表的逻辑表名称替换为真实表名称。另一部分是根据SQL解析结果替换一些在分片环境中不正确的功能。

avg计算

在分片的环境中,以avg1 +avg2+avg3/3计算平均值并不正确,需要改写为(sum1+sum2+sum3)/(count1+count2+ count3)。这就需要将包含avg的SQL改写为sum和count,然后再结果归并时重新计算平均值。

分页

1.假设每10条数据为一页,取第2页数据。在分片环境下获取limit 10, 10,归并之后再根据排序条件取出前10条数据是不正确的结果。正确的做法是将分条件改写为limit 0, 20,取出所有前2页数据,再结合排序条件算出正确的数据。可以看到越是靠后的Limit分页效率就会越低,也越浪费内存。

2.有很多方法可避免使用limit进行分页,比如构建记录行记录数和行偏移量的二级索引,或使用上次分页数据结尾ID作为下次查询条件的分页方式。

mysql 按时间分库分表_sharding-jdbc 按时间分库分表相关推荐

  1. mysql判断视图是否存在_使用JDBC查询是否存在某表或视图,按月动态生成表

    查询数据库是否有某表的存在,主要用的就是Connection对象对元数据的操作,代码很简单,贴出来大家参考 /** * 查询数据库是否有某表 * @param cnn * @param tableNa ...

  2. MySQL单表膨胀优化之MyCat分库分表

    MySQL的单表达到多少量级时性能会下降?宽表在千万量级,窄表要好一点在1200W左右.但是MySQL单表达到1500W时性能开始急剧下降! 事实上MySQL单表可以存储10亿级数据,只是这时候性能比 ...

  3. ShardingSphere简单分库分表实现(根据int分库,根据时间分表)

    1.背景 公司最近的项目开发中有一个数据库表,在给甲方部署试运行阶段发现有一个接口查询速度特别慢,然后经过排查发现,这个数据库表的的数据每天以6000-9000条的量激增,两个多月的时间已经60多万条 ...

  4. mysql分库分区分表怎么做_mysql 分区、分表、分库分表。

    一,什么是mysql分表,分区 什么是分表,从表面意思上看呢,就是把一张表分成N多个小表,具体请看:mysql分表的3种方法 什么是分区,分区呢就是把一张表的数据分成N多个区块,这些区块可以在同一个磁 ...

  5. mysql 横向分表合并_MySQL横向扩展-分库分表解决方案总结

    从业务场景看分库分表 互联网行业中,业务场景通常写少读多的情况居多,在MySQL的使用前期,读性能大多可以通过SQL优化来解决,但随着业务的持续发展,单纯依靠SQL的查询优化会越来越难以达到业务服务要 ...

  6. mysql 分表后排序_MySQL优化分库分表,为什么要分表,分表以后如何进行排序查询,业务如何设计?...

    昨天面试新人的时候,遇到了这么一个问题,按照自己的想法大体聊了一些,但大多是感性的,并没有完整的了解why and how. 今天查了一些相关的资料,包括<MySQL性能调优与架构设计>. ...

  7. MySQL分库分表会带来哪些问题?分库分表问题

    MySQL分库分表会带来哪些问题? 分库分表能有效的环节单机和单库带来的性能瓶颈和压力,突破网络IO.硬件资源.连接数的瓶颈,同时也带来了一些问题.下面将描述这些技术挑战以及对应的解决思路. 分库分表 ...

  8. mysql jdbc 分库_Sharding JDBC实现分库

    为啥要分库分表 分库分表在MySQL表结构优化的时候经常被拿到一起来说,他们的存在都是为了解决单库或者单表的查询效率快速下降而产生的,其中分表又分为垂直分表和水平分表.垂直分表主要针对表字段过多或者表 ...

  9. MySQL数据库知识学习(五)读写分离与分库分表策略

    通过数据库锁及存储引擎的学习,我们知道数据库在数据操作过程中为了保证数据的一致性是会给表或行加锁的,在网站发展的初期,由于没有太多访问量,一般来讲只需要一台服务器就够了,这的操作也不会有什么问题.但随 ...

  10. mysql分表后怎么索引_分库分表后的索引问题

    摘要 最近遇到一个慢sql,在排查过程中发现和分库分表后的索引设置有关系,总结了下问题. 问题 在进行应用健康度盘点时,发现有个慢sql 如下 select brandgoodid from bran ...

最新文章

  1. SAP SD基础知识之凭证流(Document Flow)
  2. delphi dbgrideh 遍历每一个单元格_用Python解数独[1]:求每个单元格的行值域
  3. c++ 输出控制iomanip
  4. 《C++ Primer》14.2.2节练习
  5. UTF-8 编码里,一个汉字占用多少个字节 -转
  6. php mysql安装配置_转载:PHP,MySQL的安装与配置
  7. String 和 StringBuffer 的区别
  8. 项目管理工具maven
  9. jQuery - 自定义插件开发方式
  10. 再述:python中redis的使用(Pool)
  11. 上周热点回顾(5.8-5.14)
  12. Google 阅读器键盘快捷键
  13. php微信公众号图文回复,微信公众号回复图文消息——2018年6月6日
  14. MATLAB中:冒号用法
  15. AndroidStudio无法识别字体文件(*.ttf)问题的解决
  16. 如何使用mysql数据库做网站_php小型数据库(不用mysql做网站)
  17. LInux下好用的markdown编辑器
  18. 巡查使:智能巡检领域“引航者”
  19. Invalid attempt to spread non-iterable instance错误
  20. 如何抢注好的top域名

热门文章

  1. 令人窒息!iPhone充电时自燃烧毁房子,到底是谁的锅?
  2. 2018北大计算机复试线,2018年北京大学考研复试分数线已公布
  3. 使用dlib 进行人脸识别
  4. shell学习笔记二则:统计空间
  5. Centos7没有ip地址
  6. 在switch语句中使用字符串以及实现原理
  7. java 关闭启动日志,求助啊无法启动java了点开就是报错要求查看日志
  8. display none的元素重新展示如何撑开页面_关于元素的浮动你了解多少
  9. 通过iframe搭建后台管理系统右侧内容_七巧Plus | 搭建量身定制的EAM资产管理系统...
  10. 【java】为什么 HashMap 的加载因子是0.75?