电商分表分库, 根据orderCode,uid方案思路

一、电商两种方案分库分表

1.根据订单号分表分库

  分库方案:
    根据订单号后3位, 取模分库
    后3位规则:
      1. 小于512 //图1中,我也不知道为什么运算完, 最大值不会超过512(捂脸哭)
      2. 由Long userId, Long merchantId进制转换为3位数 //因为项目有商家和用户的维度, 一个商家对应对个用户
      图1: 生成orderCode方法           
  根据配置区分哪张表分库
    图2: xml配置分库的表    
  实现dataSource连接池, 判断分库的表
    图3: xml配置分库的表    
  配置SqlSessionFactoryBean
    图4    
  思路:
    查询 : userId, merchantId 转换为3位数, 取模 

2.根据用户uid分表分库

方案1.
  某个范围的uid订单到哪些库。0到2千万uid,对应的订单数据到a库、a表。2千万到4千万对应的订单到b库。
    为什么这种方案用得比较少呢?
    容易出现瓶颈吗。某个范围内的用户,下单量比较多,那么造成这个库的压力特别大。其他库却没什么压力。
方案2.
  使用uid取模运算。第二种方案业界用得比较多。
  要扩容的时候,为了减少迁移的数据量,一般扩容是以倍数的形式增加。比如原来是8个库,扩容的时候,就要增加到16个库,
  再次扩容,就增加到32个库。这样迁移的数据量,就小很多了。这个问题不算很大问题,毕竟一次扩容,可以保证比较长的时间,
  而且使用倍数增加的方式,已经减少了数据迁移量。

方案二思路:
  下面是根据用户uid分表分库方案二思路
    按照用户id取模的方式分库分表。按照用户id作为key来切分订单数据,具体如下:
    1、 库名称定位:用户id末尾4位 取模 32。
      用户id的后4位数,取32的模(取模就是除以这个数后,余多少)。余下的数,是0-31之间。
      代码符号是用%表示:15%4=3。
      代表着32个库名称:order_db_0、order_db_2.........................order_db_31
    2、表名称定位:(用户id末尾4位 / 32) 取模 32。
       id末尾4位除以一个数,取结果的整数。比如得到结果是25.6,取整就是25。
      按照上面的规则:总共可以表示多少张表呢?32个库*每个库32个表=1024张表。如果想表的数量小,就把32改小一些。

思考优点和缺点
  优点:
    查询指定用户的所有订单,避免了跨库跨表查询。
    因为,根据一个用户的id来计算节点,用户的id是规定不变的,那么计算出的值永远是固定的(x库的x表)
    那么保存订单的时候,a用户的所有订单,都是在x库x表里面。需要查询a用户所有订单时,就不用进行跨库、跨表去查询了。

  缺点:
    1.即要扩容的时候,比较麻烦。就需要迁移数据了。要扩容的时候,为了减少迁移的数据量,一般扩容是以倍数的形式增加。
      比如原来是8个库,扩容的时候,就要增加到16个库,再次扩容,就增加到32个库。这样迁移的数据量,就小很多了。
      这个问题不算很大问题,毕竟一次扩容,可以保证比较长的时间,而且使用倍数增加的方式,已经减少了数据迁移量。
    2.数据分散不均匀,某些表的数据量特别大,某些表的数据量很小。因为某些用户下单量多,打个比方,1000-2000这个范围内的用户,下单特别多,
    3.而他们的id根据计算规则,都是分到了x库x表。造成这个表的数据量大,单表的数据量撑到极限后,咋办呢?
  总结一下:每种分库分表方案也不是十全十美,都是有利有弊的。目前来说,这种使用用户id来切分订单数据的方案,还是被大部分公司给使用。实际效果还不错。程序员省事,    至于数据量暴涨,以后再说呢。毕竟公司业务发展到什么程度,不知道的,项目存活期多久,未来不确定。先扛住再说。
  

  

参考资料:

  1.订单表的分库分表方案设计(大数据)

    https://www.cnblogs.com/wangtao_20/p/7115962.html

原文地址:https://www.cnblogs.com/jiuya/p/11588284.html

时间: 2024-10-27 06:59:42

电商分表分库, 根据orderCode,uid方案思路的相关文章

重新学习Mysql数据13:Mysql主从复制,读写分离,分表分库策略与实践

一.MySQL扩展具体的实现方式 随着业务规模的不断扩大,需要选择合适的方案去应对数据规模的增长,以应对逐渐增长的访问压力和数据量. 关于数据库的扩展主要包括:业务拆分.主从复制.读写分离.数据库分库与分表等.这篇文章主要讲述数据库分库与分表 (1)业务拆分 在?大型网站应用之海量数据和高并发解决方案总结一二?一篇文章中也具体讲述了为什么要对业务进行拆分. 业务起步初始,为了加快应用上线和快速迭代,很多应用都采用集中式的架构.随着业务系统的扩大,系统变得越来越复杂,越来越难以维护,开发效率变得越

Mysql分表分库分析

对于大型的互联网应用,数据库单表的数据量可能达到千万甚至上亿级别,同时面临这高并发的压力.Master-Slave结构只能对数据库的读能力进行扩展,写操作还是集中在Master中,Master并不能无限制的挂接Slave库,如果需要对数据库的吞吐能力进行进一步的扩展,可以考虑采用分库分表的策略. 1.分表 在分表之前,首先要选中合适的分表策略(以哪个字典为分表字段,需要将数据分为多少张表),使数据能够均衡的分布在多张表中,并且不影响正常的查询.在企业级应用中,往往使用org_id(组织主键)做为

分表分库方法总结

案例一: 1,背景:一个地址薄的应用程序,设计的用户量为2亿,统计出每个用户的地址薄为30个左右,整个数据量为60亿,使用mysql数据库 计划分为:1000个表,100个库 2,分库分表代码 ? 1 2 3 4 5 6 7 8 private function getDbNo($email)  {      $m = md5($email);      $n = hexdec(substr($m, 0, 16));      $tableNo = fmod($n, 1000);      $d

总结下Mysql分表分库的策略及应用

上月前面试某公司,对于mysql分表的思路,当时简要的说了下hash算法分表,以及discuz分表的思路,但是对于新增数据自增id存放的设计思想回答的不是很好(笔试+面试整个过程算是OK过了,因与个人预期的薪酬不太理想而忍痛放弃.),在此再深究下mysql 分表优化之类的设计思路方案.先来闲扯下发文目的: 为什么要分表和分区? 日常开发中我们经常会遇到大表的情况,所谓的大表是指存储了百万级乃至千万级条记录的表.这样的表过于庞大,导致数据库在查询和插入的时候耗时太长,性能低下,如果涉及联合查询的情

关于论坛数据库的设计(分表分库等-转)

关于论坛数据库的设计 文章分类:数据库 一个简单的论坛系统 1:包含下列信息: 2:每天论坛访问量300万左右,更新帖子10万左右. 请给出数据库表结构设计,并结合范式简要说明设计思路. 一. 发帖主题和回复信息存放在一张表,并在这个表中增加user_name字段 对数据库的操作而言,检索数据的性能基本不会对数据造成很大的影响(精确查找的情况下),而对表与表之间的连接却会产生巨大的影响, 特别在有巨量数据的表之间:因此对问题的定位基本可以确定:在显示和检索数据时,尽量减少数据库的连接以及表与表之

Mycat分表分库 

一.Mycat介绍 Mycat 是一个开源的分布式数据库系统,是一个实现了 MySQL 协议的的Server,前端用户可以把它看作是一个数据库代理,用 MySQL 客户端工具和命令行访问,而其后端可以用MySQL 原生(Native)协议与多个 MySQL 服务器通信,也可以用 JDBC 协议与大多数主流数据库服务器通信,其核心功能是分表分库,即将一个大表水平分割为 N 个小表,存储在后端 MySQL 服务器里或者其他数据库里. 二.Mycat基础环境搭建 首先需要下载Mycat必需的一些环境:

Mycat分表分库  

一.Mycat介绍 Mycat 是一个开源的分布式数据库系统,是一个实现了 MySQL 协议的的Server,前端用户可以把它看作是一个数据库代理,用 MySQL 客户端工具和命令行访问,而其后端可以用MySQL 原生(Native)协议与多个 MySQL 服务器通信,也可以用 JDBC 协议与大多数主流数据库服务器通信,其核心功能是分表分库,即将一个大表水平分割为 N 个小表,存储在后端 MySQL 服务器里或者其他数据库里. 二.Mycat基础环境搭建 首先需要下载Mycat必需的一些环境:

Mycat分表分库怎么分?Mysql DBA学习

Mycat分表分库虽然能解决大表对数据库系统的压力,但也有一些不利,因此Mycat分表分库要先解决的问题是,分不分库,分哪些库,什么规则分,分多少分片.那么究竟是怎么分的呢? 1.能不分就不分,1000万以内的表,不建议分片,通过合适的索引,读写分离等方式,可以很好的解决性能问题. 2.分片数量尽量少,分片尽量均匀分布在多个DataHost上,因为一个查询SQL跨分片越多,则总体性能越差,虽然要好于所有数据在一个分片的结果,只在必要的时候进行扩容,增加分片数量. 3.分片规则需要慎重选择,分片规

shrding_jdbc分表分库

请求量太多,一个redis忙不过来----->redis主从复制.哨兵.redis cluster集群...redis本身数据量少,多个redis都拥有全量数据,没毛病.那数据库呢?一个表的数据量太大,分表.一个数据库的数据量太大,分库.如何将数据分到每个表.每个库,并从中获取呢?得有一种策略或者说一种算法(hash取余).进一步的思考,何时才能决定将数据放入到哪个数据库,哪个表呢?sql语句形成之后啊估计得拦截数据的存储和拿取吧(不拦截如何达到控制的目的),所以sharding_jdbc获得了