mysql分表

分表的目的是为了当表数据大的时候,为了减少花费时间所存在的一种机制。

1.这里有一张Product表。

CREATE TABLE `product` (
  `id` varchar(64) COLLATE utf8_bin NOT NULL,
  `code` varchar(64) COLLATE utf8_bin NOT NULL COMMENT '代码',
  `sku` varchar(64) COLLATE utf8_bin DEFAULT NULL COMMENT 'SKU',
  `name` varchar(255) COLLATE utf8_bin NOT NULL COMMENT '名称',
  `full_name` varchar(255) COLLATE utf8_bin DEFAULT NULL COMMENT '全称',
  `short_name` varchar(64) COLLATE utf8_bin DEFAULT NULL COMMENT '全称',
  `english_name` varchar(255) COLLATE utf8_bin DEFAULT NULL COMMENT '英文名',
  `spec` varchar(255) COLLATE utf8_bin DEFAULT NULL COMMENT '规格',
  `shelf_life` int(11) DEFAULT NULL COMMENT '保质期',
  `ctn_gtin` varchar(64) COLLATE utf8_bin DEFAULT NULL COMMENT '箱GTIN',
  `pcs_gtin` varchar(64) COLLATE utf8_bin DEFAULT NULL COMMENT '单品GTIN',
  `type_id` varchar(64) COLLATE utf8_bin DEFAULT NULL COMMENT '类型id',
  `active` tinyint(1) DEFAULT '1' COMMENT '可用',
  `pcs_per_ctn` int(11) DEFAULT NULL COMMENT '每箱单品数',
  `ctn_per_plt` int(11) unsigned DEFAULT NULL COMMENT '每托箱数',
  `barcode` varchar(255) COLLATE utf8_bin DEFAULT NULL COMMENT '条码',
  `jde_code` varchar(64) COLLATE utf8_bin DEFAULT NULL COMMENT 'JDE编码',
  `create_by` varchar(64) COLLATE utf8_bin DEFAULT NULL COMMENT '创建者',
  `create_date` datetime NOT NULL COMMENT '创建时间',
  `update_by` varchar(64) COLLATE utf8_bin DEFAULT NULL COMMENT '更新者',
  `update_date` datetime NOT NULL COMMENT '更新时间',
  `remarks` varchar(255) COLLATE utf8_bin DEFAULT NULL COMMENT '备注信息',
  `del_flag` char(1) COLLATE utf8_bin NOT NULL DEFAULT '0' COMMENT '删除标记(0:正常;1:删除)',
  `type` varchar(64) COLLATE utf8_bin DEFAULT NULL COMMENT '产品类型',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

2.建两张product2、product3 表用于分担原表的数据量,两表的结构字段必须和原表product一致:

CREATE TABLE `product2` (
  `id` varchar(64) COLLATE utf8_bin NOT NULL,
  `code` varchar(64) COLLATE utf8_bin NOT NULL COMMENT '代码',
  `sku` varchar(64) COLLATE utf8_bin DEFAULT NULL COMMENT 'SKU',
  `name` varchar(255) COLLATE utf8_bin NOT NULL COMMENT '名称',
  `full_name` varchar(255) COLLATE utf8_bin DEFAULT NULL COMMENT '全称',
  `short_name` varchar(64) COLLATE utf8_bin DEFAULT NULL COMMENT '全称',
  `english_name` varchar(255) COLLATE utf8_bin DEFAULT NULL COMMENT '英文名',
  `spec` varchar(255) COLLATE utf8_bin DEFAULT NULL COMMENT '规格',
  `shelf_life` int(11) DEFAULT NULL COMMENT '保质期',
  `ctn_gtin` varchar(64) COLLATE utf8_bin DEFAULT NULL COMMENT '箱GTIN',
  `pcs_gtin` varchar(64) COLLATE utf8_bin DEFAULT NULL COMMENT '单品GTIN',
  `type_id` varchar(64) COLLATE utf8_bin DEFAULT NULL COMMENT '类型id',
  `active` tinyint(1) DEFAULT '1' COMMENT '可用',
  `pcs_per_ctn` int(11) DEFAULT NULL COMMENT '每箱单品数',
  `ctn_per_plt` int(11) unsigned DEFAULT NULL COMMENT '每托箱数',
  `barcode` varchar(255) COLLATE utf8_bin DEFAULT NULL COMMENT '条码',
  `jde_code` varchar(64) COLLATE utf8_bin DEFAULT NULL COMMENT 'JDE编码',
  `create_by` varchar(64) COLLATE utf8_bin DEFAULT NULL COMMENT '创建者',
  `create_date` datetime NOT NULL COMMENT '创建时间',
  `update_by` varchar(64) COLLATE utf8_bin DEFAULT NULL COMMENT '更新者',
  `update_date` datetime NOT NULL COMMENT '更新时间',
  `remarks` varchar(255) COLLATE utf8_bin DEFAULT NULL COMMENT '备注信息',
  `del_flag` char(1) COLLATE utf8_bin NOT NULL DEFAULT '0' COMMENT '删除标记(0:正常;1:删除)',
  `type` varchar(64) COLLATE utf8_bin DEFAULT NULL COMMENT '产品类型',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

CREATE TABLE `product3` (
  `id` varchar(64) COLLATE utf8_bin NOT NULL,
  `code` varchar(64) COLLATE utf8_bin NOT NULL COMMENT '代码',
  `sku` varchar(64) COLLATE utf8_bin DEFAULT NULL COMMENT 'SKU',
  `name` varchar(255) COLLATE utf8_bin NOT NULL COMMENT '名称',
  `full_name` varchar(255) COLLATE utf8_bin DEFAULT NULL COMMENT '全称',
  `short_name` varchar(64) COLLATE utf8_bin DEFAULT NULL COMMENT '全称',
  `english_name` varchar(255) COLLATE utf8_bin DEFAULT NULL COMMENT '英文名',
  `spec` varchar(255) COLLATE utf8_bin DEFAULT NULL COMMENT '规格',
  `shelf_life` int(11) DEFAULT NULL COMMENT '保质期',
  `ctn_gtin` varchar(64) COLLATE utf8_bin DEFAULT NULL COMMENT '箱GTIN',
  `pcs_gtin` varchar(64) COLLATE utf8_bin DEFAULT NULL COMMENT '单品GTIN',
  `type_id` varchar(64) COLLATE utf8_bin DEFAULT NULL COMMENT '类型id',
  `active` tinyint(1) DEFAULT '1' COMMENT '可用',
  `pcs_per_ctn` int(11) DEFAULT NULL COMMENT '每箱单品数',
  `ctn_per_plt` int(11) unsigned DEFAULT NULL COMMENT '每托箱数',
  `barcode` varchar(255) COLLATE utf8_bin DEFAULT NULL COMMENT '条码',
  `jde_code` varchar(64) COLLATE utf8_bin DEFAULT NULL COMMENT 'JDE编码',
  `create_by` varchar(64) COLLATE utf8_bin DEFAULT NULL COMMENT '创建者',
  `create_date` datetime NOT NULL COMMENT '创建时间',
  `update_by` varchar(64) COLLATE utf8_bin DEFAULT NULL COMMENT '更新者',
  `update_date` datetime NOT NULL COMMENT '更新时间',
  `remarks` varchar(255) COLLATE utf8_bin DEFAULT NULL COMMENT '备注信息',
  `del_flag` char(1) COLLATE utf8_bin NOT NULL DEFAULT '0' COMMENT '删除标记(0:正常;1:删除)',
  `type` varchar(64) COLLATE utf8_bin DEFAULT NULL COMMENT '产品类型',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;


3.最后将product前五条数据的数据分配给product2、将product的后两天数据分配给product3

INSERT INTO product2(
     product2.id,product2.code,product2.sku,
     product2.name,product2.full_name,product2.short_name,
     product2.english_name,product2.spec,product2.shelf_life,
     product2.ctn_gtin,product2.pcs_gtin,product2.type_id,
     product2.active,product2.pcs_per_ctn,product2.ctn_per_plt,
     product2.barcode,product2.jde_code,product2.create_date,product2.create_by,
     product2.update_date,product2.remarks,product2.del_flag,
     product2.type)
SELECT  
    product.id,product.code,product.sku,
    product.name,product.full_name,product.short_name,
    product.english_name,product.spec,product.shelf_life,
    product.ctn_gtin,product.pcs_gtin,product.type_id,
    product.active,product.pcs_per_ctn,product.ctn_per_plt,
    product.barcode,product.jde_code,product.create_date,product.create_by,
    product.update_date,product.remarks,product.del_flag,
    product.type FROM product limit 5

INSERT INTO product3(
  product3.id,product3.code,product3.sku,
  product3.name,product3.full_name,product3.short_name,
  product3.english_name,product3.spec,product3.shelf_life,
  product3.ctn_gtin,product3.pcs_gtin,product3.type_id,
  product3.active,product3.pcs_per_ctn,product3.ctn_per_plt,
  product3.barcode,product3.jde_code,product3.create_date,product3.create_by,
  product3.update_date,product3.remarks,product3.del_flag,
  product3.type)
SELECT  
  product.id,product.code,product.sku,
  product.name,product.full_name,product.short_name,
  product.english_name,product.spec,product.shelf_life,
  product.ctn_gtin,product.pcs_gtin,product.type_id,
  product.active,product.pcs_per_ctn,product.ctn_per_plt,
  product.barcode,product.jde_code,product.create_date,product.create_by,
  product.update_date,product.remarks,product.del_flag,
  product.type FROM product order by id desc limit 2 

`



参考:http://blog.51yip.com/mysql/949.html

### MySQL 分表策略与实现方法 #### 一、分表的概念及其重要性 当单个表的数据量过大时,查询性能可能会显著下降。为了提升数据库的读写效率并优化资源利用,可以采用分表技术。分表的核心在于将一张大表拆分为多个较小的子表,从而减少每次操作涉及的数据规模[^1]。 #### 二、分表的主要方式 分表通常可分为两种主要形式:**垂直分表**和**水平分表**。 - **垂直分表** 垂直分表是指按列划分数据结构,即将同一张表中的某些字段分离出来形成新的表。这种方法适用于部分字段访问频率较低的情况。例如,假设有一张用户表 `users`,其中包含用户的个人信息以及一些不常用的日志记录字段,可以通过创建一个新的表存储这些低频使用的字段来降低原表复杂度[^4]。 - **水平分表** 水平分表则是基于行进行分割,通常是依据某个特定条件(如时间戳、ID范围等),将满足该条件的部分数据存入不同的子表中。这种方式适合于那些随着时间增长不断积累新数据的大表。 ```sql -- 示例:水平分表按照日期分区 CREATE TABLE orders_2023 ( id INT PRIMARY KEY, order_date DATE NOT NULL, amount DECIMAL(10, 2) ); CREATE TABLE orders_2024 LIKE orders_2023; ``` #### 三、分表的具体实现方法 以下是几种常见的分表实现方案: 1. **手动分表** 手动分表是最简单的方式之一,开发者可以根据实际需求自行设计如何分配数据至各个子表。然而,这种做法增加了维护成本,并可能导致逻辑错误的发生概率增加。 2. **使用中间件工具** 随着技术的发展,许多优秀的开源项目提供了自动化的分库分表示能。比如 MyCat 和 ShardingSphere 就是非常流行的两个选项。它们能够帮助企业快速搭建分布式架构环境下的高效解决方案[^3]。 - **MyCat**: 支持灵活配置路由规则,允许自定义 SQL 解析器等功能; - **ShardingSphere**: 提供更丰富的特性集,包括但不限于透明化客户端接入层、动态扩展能力支持等等。 3. **依赖框架完成** 对于应用程序而言,也可以借助 ORM (Object Relational Mapping) 框架内置的支持机制来进行无缝切换。像 Hibernate 或者 Django 的模型迁移功能都可以很好地配合后台服务端一起工作[^2]。 #### 四、注意事项及潜在挑战 尽管分表带来了诸多好处,但也伴随着一定风险或局限之处需要注意规避: - 数据一致性难以保障; - 跨表联结变得困难重重; - 备份恢复过程更加繁琐耗时; 因此,在决定实施之前务必权衡利弊得失后再行动[^3]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值