MySQL分库分表创建新表结构(2nd)

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介:

前言

在互联网时代大家都知道数据量是爆炸试的增加,从之前的表结构设计来看,我们很容易的知道商品表(goods)、订单表(orders)、订单商品表(order_goods)这几张表的数据量将会爆炸试的增加。

因此,在数据量达到一定程度就算是建了索引,查询使用了索引,查询、修改速度也是会降下来的。为了额能较好的克服这样的问题,我们不得不重新整理并对大数据的表进行表切分。

分表介绍

当下有静态分表和动态分表两种:

  • 静态分表:事先估算出表能达到的量,然后根据每一个表需要存多少数据直接算出需要创建表的数量。如:1亿数据每一个表 100W 条数据那就要建100张表,然后通过一定的hash算法计算每一条数据存放在那张表。其实就有点像是使用partition table 一样。静态分表有一个毙命就是当分的那么多表还不满足时,需要再扩展难度和成本就会很高。

  • 动态分表:同样也是对大数据量的表进行拆分,他可以避免静态分表带来的后遗症。当然也需要在设计上多一些东西(这往往是我们能接受的)。

如果使用了分表的设计的数据库在一些查询上面会变的复杂一些。

我的选择

本着要让之后让表能更好的扩展,并能达到手工指定数据到自己想要的表,为了以后能自动化分表操作,我选择了动态分表。

业务分解

由于在我们的业务中每一个导购除了能卖东西,还能买东西,因此在逻辑上就分为两张表:出售订单表、购买订单表。

业务分解后表结构图如下:

mysql


我们潜规则

我们是按user表中的每一个用户去指定他的订单数据要在哪个表。

由于按用户分表后会涉及到是然购买者方便查询,还是让销售者方便查询的问题。我们这里选择的是让销售者查询方便来分表,因为销售者的查询和对订单的修改会频繁一些。因此,我们将出售订单表中存放着比较完整的订单信息,而在购买订单表中存放的是出售订单表的ID作为关联。

我们出购买订单表ID和售订单表ID保持一致。

小提示:你也可以在购买订单表中添加一些冗余字段为了更好的查询,但是建议冗余字段不要是业务上是可变的。

业务分解后数据迁移到新表

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
-- 创建出售订单表-sell_order_1
CREATE  TABLE  sell_order_1  LIKE  orders;
-- 修改出售订单表ID字段名
ALTER  TABLE  sell_order_1
   CHANGE orders_id sell_order_id  INT  unsigned  NOT  NULL  AUTO_INCREMENT 
   COMMENT  '出售订单ID' ;
-- 修改商品订单表的订单ID名为sell_order_id
ALTER  TABLE  order_goods
   CHANGE orders_id sell_order_id  INT  unsigned  NOT  NULL
   COMMENT  '出售订单ID' ;
-- 将orders表数据转移到sell_order_1表
INSERT  INTO  sell_order_1
SELECT  FROM  orders;
  
-- 迁移商品表到 goods_1
CREATE  TABLE  goods_1  LIKE  goods;
-- 插入goods_1表数据
INSERT  INTO  goods_1
SELECT  FROM  goods;
  
-- 迁移订单商品表到order_goods_1
CREATE  TABLE  order_goods_1  LIKE  order_goods;
-- 插入order_goods_1
INSERT  INTO  order_goods_1
SELECT  FROM  order_goods;
  
-- 创建购买订单表
CREATE  TABLE  buy_order_1(
   buy_order_id  BIGINT  unsigned  NOT  NULL  COMMENT  '出售订单ID与出售订单相等' ,
   user_id  INT  unsigned  DEFAULT  NULL  COMMENT  '下单用户ID' ,
   user_guide_id  INT  unsigned  DEFAULT  NULL  COMMENT  '导购ID' ,
   PRIMARY  KEY (buy_order_id),
   KEY  idx$buy_order_1$user_id(user_id),
   KEY  idx$buy_order_1user_guide_id(user_guide_id)
);
-- 买订单表导入数据
INSERT  INTO  buy_order_1
SELECT  sell_order_id,
   user_id,
   user_guide_id
FROM  sell_order_1;
  
-- user表增加指定表标识字段
ALTER  TABLE  user
   ADD  table_flag TINYINT  NOT  NULL  DEFAULT  1
   COMMENT  '分表标识' ;


出自:http://www.ttlsa.com/mysql/mysql-distributed-database-and-table-create-new-table/






      本文转自027ryan  51CTO博客,原文链接:http://blog.51cto.com/ucode/1746008,如需转载请自行联系原作者




相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
4月前
|
存储 SQL 关系型数据库
MySQL分库分表
MySQL分库分表
41 0
|
4月前
|
关系型数据库 MySQL Java
MySQL单表膨胀优化之MyCat分库分表
MySQL单表膨胀优化之MyCat分库分表
64 0
|
5月前
|
Oracle 关系型数据库 MySQL
MySQL复制表结构create table as与like的区别
MySQL复制表结构create table as与like的区别
|
6月前
|
存储 SQL 关系型数据库
表结构的操作【MySQL】
表结构的操作【MySQL】
52 0
|
4月前
|
SQL 关系型数据库 MySQL
②⑩① 【MySQL】什么是分库分表?拆分策略有什么?什么是MyCat?
②⑩① 【MySQL】什么是分库分表?拆分策略有什么?什么是MyCat?
56 0
|
3月前
|
SQL 存储 关系型数据库
Mysql系列-5.Mysql分库分表(中)
Mysql系列-5.Mysql分库分表
35 0
|
2月前
|
存储 关系型数据库 MySQL
MySQL技能完整学习列表5、数据库操作——1、创建数据库和表——2、修改表结构(ALTER TABLE)
MySQL技能完整学习列表5、数据库操作——1、创建数据库和表——2、修改表结构(ALTER TABLE)
183 0
|
4月前
|
中间件 关系型数据库 Java
MySQL数据库分库分表方案
MySQL数据库分库分表方案
134 0
MySQL数据库分库分表方案
|
7月前
|
SQL 关系型数据库 MySQL
MySQL数据库---库基本操作 以及 表结构的操作(DDL)
MySQL数据库---库基本操作 以及 表结构的操作(DDL)
86 3
|
3月前
|
存储 cobar 关系型数据库
MySQL分库分表
MySQL分库分表
47 1