一、分库分表分区分别是什么?为什么这么做
了解分库分表的原因,如果不分表瓶颈会在哪里
- 分库分表的原因
- 数据库最容易产生性能瓶颈的服务组件。数据库连接数资源捉襟见肘和数据库因为表多、数据多造成的性能问题
- 单一服务中心的数据访问压力也必然会达到单机数据库的承载上限,所以在进行服务化改造的同一时间段内,需要对数据库能力做扩展的工作
- 单台数据库 这里以mysql为例,mysql数据库,当访问连接数过多时,就会出现‘too many connections’的错误,一般来说是访问量太大或者数据库设置的最大连接数太小的原因。Mysql默认的最大连接数为100.这个连接连接数可以修改,而mysql服务允许的最大连接数为16384
- 什么是分区?
- 分表是将一张表分成N多个小表,分区是把一张表的数据分成N多个区块,这些区块可以在同一个磁盘上,也可以在不同的磁盘上
- 物理上多表存储,但是逻辑上单表操作
二、分库分表常见手段分析
了解分库分表常见手段以及选择考虑方向
- 一般会有两种分库分表方向,分别是垂直方向和水平方向,第一种方案是直接对现有的数据库进行垂直拆分,可以缓解目前写峰值QPS过大、DB主从延迟的问题。第二种方案是对现有数据库大表进行分库分表
- 根据不同规模对垂直方向和水平方向的选择
- 单个库太大,这时我们要看是因为表多而导致数据多,还是因为单张表里面的数据多。 如果是因为表多而数据多,使用垂直切分,根据业务切分成不同的库
- 单张表的数据量太大,这时要用水平切分,即把表的数据按某种规则切分成多张表,甚至多个库上的多张表。 分库分表的顺序应该是先垂直分,后水平分。 因为垂直分更简单,更符合我们处理现实世界问题的方式
- 垂直拆分
- 垂直分表:也就是“大表拆小表”,基于列字段进行的。一般是表中的字段较多,将不常用的, 数据较大,长度较长(比如text类型字段)的拆分到“扩展表“
- 垂直分库:垂直分库针对的是一个系统中的不同业务进行拆分, 数据库的连接资源比较宝贵且单机处理能力也有限,在高并发场景下,垂直分库一定程度上能够突破IO、连接数及单机硬件资源的瓶颈
- 水平拆分
- 水平分表:针对数据量巨大的单张表(比如订单表),按照某种规则(RANGE,HASH取模等),切分到多张表里面去。 但是这些表还是在同一个库中,所以库级别的数据库操作还是有IO瓶颈
- 水平分库:将单张表的数据切分到多个服务器上去,每个服务器具有相应的库与表,只是表中数据集合不同。 水平分库分表能够有效的缓解单机和单库的性能瓶颈和压力,突破IO、连接数、硬件资源等的瓶颈
三、分库分表实战环境准备
水平分库分表的模型设计
建表语句编写
太长了,收起来,避免篇幅太长
点击查看完整内容
CREATE TABLE if not exists product_0 ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '自增id',`sale_id` varchar(64) NOT NULL DEFAULT '' COMMENT '卖家ID', `store_id` varchar(64) NOT NULL COMMENT '店铺ID', `product_seq` varchar(64) NOT NULL COMMENT '商品标识', `sku_id` varchar(64) NOT NULL COMMENT '商品skuID', `spu_id` varchar(64) NOT NULL COMMENT '商品spuID', `valid` tinyint(1) DEFAULT '1' COMMENT '是否有效,0无效,1有效', `create_time` datetime DEFAULT '2020-01-01 00:00:00' COMMENT '创建时间', `update_time` datetime DEFAULT '2020-01-01 00:00:00' COMMENT '更新时间', PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4; CREATE TABLE if not exists product_1 ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '自增id',`sale_id` varchar(64) NOT NULL DEFAULT '' COMMENT '卖家ID', `store_id` varchar(64) NOT NULL COMMENT '店铺ID', `product_seq` varchar(64) NOT NULL COMMENT '商品标识', `sku_id` varchar(64) NOT NULL COMMENT '商品skuID', `spu_id` varchar(64) NOT NULL COMMENT '商品spuID', `valid` tinyint(1) DEFAULT '1' COMMENT '是否有效,0无效,1有效', `create_time` datetime DEFAULT '2020-01-01 00:00:00' COMMENT '创建时间', `update_time` datetime DEFAULT '2020-01-01 00:00:00' COMMENT '更新时间', PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4; CREATE TABLE if not exists product_2 ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '自增id',`sale_id` varchar(64) NOT NULL DEFAULT '' COMMENT '卖家ID', `store_id` varchar(64) NOT NULL COMMENT '店铺ID', `product_seq` varchar(64) NOT NULL COMMENT '商品标识', `sku_id` varchar(64) NOT NULL COMMENT '商品skuID', `spu_id` varchar(64) NOT NULL COMMENT '商品spuID', `valid` tinyint(1) DEFAULT '1' COMMENT '是否有效,0无效,1有效', `create_time` datetime DEFAULT '2020-01-01 00:00:00' COMMENT '创建时间', `update_time` datetime DEFAULT '2020-01-01 00:00:00' COMMENT '更新时间', PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4; CREATE TABLE if not exists product_3 ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '自增id',`sale_id` varchar(64) NOT NULL DEFAULT '' COMMENT '卖家ID', `store_id` varchar(64) NOT NULL COMMENT '店铺ID', `product_seq` varchar(64) NOT NULL COMMENT '商品标识', `sku_id` varchar(64) NOT NULL COMMENT '商品skuID', `spu_id` varchar(64) NOT NULL COMMENT '商品spuID', `valid` tinyint(1) DEFAULT '1' COMMENT '是否有效,0无效,1有效', `create_time` datetime DEFAULT '2020-01-01 00:00:00' COMMENT '创建时间', `update_time` datetime DEFAULT '2020-01-01 00:00:00' COMMENT '更新时间', PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4; CREATE TABLE if not exists product_4 ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '自增id',`sale_id` varchar(64) NOT NULL DEFAULT '' COMMENT '卖家ID', `store_id` varchar(64) NOT NULL COMMENT '店铺ID', `product_seq` varchar(64) NOT NULL COMMENT '商品标识', `sku_id` varchar(64) NOT NULL COMMENT '商品skuID', `spu_id` varchar(64) NOT NULL COMMENT '商品spuID', `valid` tinyint(1) DEFAULT '1' COMMENT '是否有效,0无效,1有效', `create_time` datetime DEFAULT '2020-01-01 00:00:00' COMMENT '创建时间', `update_time` datetime DEFAULT '2020-01-01 00:00:00' COMMENT '更新时间', PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4; CREATE TABLE if not exists product_5 ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '自增id',`sale_id` varchar(64) NOT NULL DEFAULT '' COMMENT '卖家ID', `store_id` varchar(64) NOT NULL COMMENT '店铺ID', `product_seq` varchar(64) NOT NULL COMMENT '商品标识', `sku_id` varchar(64) NOT NULL COMMENT '商品skuID', `spu_id` varchar(64) NOT NULL COMMENT '商品spuID', `valid` tinyint(1) DEFAULT '1' COMMENT '是否有效,0无效,1有效', `create_time` datetime DEFAULT '2020-01-01 00:00:00' COMMENT '创建时间', `update_time` datetime DEFAULT '2020-01-01 00:00:00' COMMENT '更新时间', PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4; CREATE TABLE if not exists product_6 ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '自增id',`sale_id` varchar(64) NOT NULL DEFAULT '' COMMENT '卖家ID', `store_id` varchar(64) NOT NULL COMMENT '店铺ID', `product_seq` varchar(64) NOT NULL COMMENT '商品标识', `sku_id` varchar(64) NOT NULL COMMENT '商品skuID', `spu_id` varchar(64) NOT NULL COMMENT '商品spuID', `valid` tinyint(1) DEFAULT '1' COMMENT '是否有效,0无效,1有效', `create_time` datetime DEFAULT '2020-01-01 00:00:00' COMMENT '创建时间', `update_time` datetime DEFAULT '2020-01-01 00:00:00' COMMENT '更新时间', PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4; CREATE TABLE if not exists product_7 ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '自增id',`sale_id` varchar(64) NOT NULL DEFAULT '' COMMENT '卖家ID', `store_id` varchar(64) NOT NULL COMMENT '店铺ID', `product_seq` varchar(64) NOT NULL COMMENT '商品标识', `sku_id` varchar(64) NOT NULL COMMENT '商品skuID', `spu_id` varchar(64) NOT NULL COMMENT '商品spuID', `valid` tinyint(1) DEFAULT '1' COMMENT '是否有效,0无效,1有效', `create_time` datetime DEFAULT '2020-01-01 00:00:00' COMMENT '创建时间', `update_time` datetime DEFAULT '2020-01-01 00:00:00' COMMENT '更新时间', PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4; CREATE TABLE if not exists product_8 ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '自增id',`sale_id` varchar(64) NOT NULL DEFAULT '' COMMENT '卖家ID', `store_id` varchar(64) NOT NULL COMMENT '店铺ID', `product_seq` varchar(64) NOT NULL COMMENT '商品标识', `sku_id` varchar(64) NOT NULL COMMENT '商品skuID', `spu_id` varchar(64) NOT NULL COMMENT '商品spuID', `valid` tinyint(1) DEFAULT '1' COMMENT '是否有效,0无效,1有效', `create_time` datetime DEFAULT '2020-01-01 00:00:00' COMMENT '创建时间', `update_time` datetime DEFAULT '2020-01-01 00:00:00' COMMENT '更新时间', PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4; CREATE TABLE if not exists product_9 ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '自增id',`sale_id` varchar(64) NOT NULL DEFAULT '' COMMENT '卖家ID', `store_id` varchar(64) NOT NULL COMMENT '店铺ID', `product_seq` varchar(64) NOT NULL COMMENT '商品标识', `sku_id` varchar(64) NOT NULL COMMENT '商品skuID', `spu_id` varchar(64) NOT NULL COMMENT '商品spuID', `valid` tinyint(1) DEFAULT '1' COMMENT '是否有效,0无效,1有效', `create_time` datetime DEFAULT '2020-01-01 00:00:00' COMMENT '创建时间', `update_time` datetime DEFAULT '2020-01-01 00:00:00' COMMENT '更新时间', PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4; CREATE TABLE if not exists product_10 ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '自增id',`sale_id` varchar(64) NOT NULL DEFAULT '' COMMENT '卖家ID', `store_id` varchar(64) NOT NULL COMMENT '店铺ID', `product_seq` varchar(64) NOT NULL COMMENT '商品标识', `sku_id` varchar(64) NOT NULL COMMENT '商品skuID', `spu_id` varchar(64) NOT NULL COMMENT '商品spuID', `valid` tinyint(1) DEFAULT '1' COMMENT '是否有效,0无效,1有效', `create_time` datetime DEFAULT '2020-01-01 00:00:00' COMMENT '创建时间', `update_time` datetime DEFAULT '2020-01-01 00:00:00' COMMENT '更新时间', PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4; CREATE TABLE if not exists product_11 ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '自增id',`sale_id` varchar(64) NOT NULL DEFAULT '' COMMENT '卖家ID', `store_id` varchar(64) NOT NULL COMMENT '店铺ID', `product_seq` varchar(64) NOT NULL COMMENT '商品标识', `sku_id` varchar(64) NOT NULL COMMENT '商品skuID', `spu_id` varchar(64) NOT NULL COMMENT '商品spuID', `valid` tinyint(1) DEFAULT '1' COMMENT '是否有效,0无效,1有效', `create_time` datetime DEFAULT '2020-01-01 00:00:00' COMMENT '创建时间', `update_time` datetime DEFAULT '2020-01-01 00:00:00' COMMENT '更新时间', PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4; CREATE TABLE if not exists product_12 ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '自增id',`sale_id` varchar(64) NOT NULL DEFAULT '' COMMENT '卖家ID', `store_id` varchar(64) NOT NULL COMMENT '店铺ID', `product_seq` varchar(64) NOT NULL COMMENT '商品标识', `sku_id` varchar(64) NOT NULL COMMENT '商品skuID', `spu_id` varchar(64) NOT NULL COMMENT '商品spuID', `valid` tinyint(1) DEFAULT '1' COMMENT '是否有效,0无效,1有效', `create_time` datetime DEFAULT '2020-01-01 00:00:00' COMMENT '创建时间', `update_time` datetime DEFAULT '2020-01-01 00:00:00' COMMENT '更新时间', PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4; CREATE TABLE if not exists product_13 ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '自增id',`sale_id` varchar(64) NOT NULL DEFAULT '' COMMENT '卖家ID', `store_id` varchar(64) NOT NULL COMMENT '店铺ID', `product_seq` varchar(64) NOT NULL COMMENT '商品标识', `sku_id` varchar(64) NOT NULL COMMENT '商品skuID', `spu_id` varchar(64) NOT NULL COMMENT '商品spuID', `valid` tinyint(1) DEFAULT '1' COMMENT '是否有效,0无效,1有效', `create_time` datetime DEFAULT '2020-01-01 00:00:00' COMMENT '创建时间', `update_time` datetime DEFAULT '2020-01-01 00:00:00' COMMENT '更新时间', PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4; CREATE TABLE if not exists product_14 ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '自增id',`sale_id` varchar(64) NOT NULL DEFAULT '' COMMENT '卖家ID', `store_id` varchar(64) NOT NULL COMMENT '店铺ID', `product_seq` varchar(64) NOT NULL COMMENT '商品标识', `sku_id` varchar(64) NOT NULL COMMENT '商品skuID', `spu_id` varchar(64) NOT NULL COMMENT '商品spuID', `valid` tinyint(1) DEFAULT '1' COMMENT '是否有效,0无效,1有效', `create_time` datetime DEFAULT '2020-01-01 00:00:00' COMMENT '创建时间', `update_time` datetime DEFAULT '2020-01-01 00:00:00' COMMENT '更新时间', PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4; CREATE TABLE if not exists product_15 ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '自增id',`sale_id` varchar(64) NOT NULL DEFAULT '' COMMENT '卖家ID', `store_id` varchar(64) NOT NULL COMMENT '店铺ID', `product_seq` varchar(64) NOT NULL COMMENT '商品标识', `sku_id` varchar(64) NOT NULL COMMENT '商品skuID', `spu_id` varchar(64) NOT NULL COMMENT '商品spuID', `valid` tinyint(1) DEFAULT '1' COMMENT '是否有效,0无效,1有效', `create_time` datetime DEFAULT '2020-01-01 00:00:00' COMMENT '创建时间', `update_time` datetime DEFAULT '2020-01-01 00:00:00' COMMENT '更新时间', PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4; CREATE TABLE if not exists product_16 ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '自增id',`sale_id` varchar(64) NOT NULL DEFAULT '' COMMENT '卖家ID', `store_id` varchar(64) NOT NULL COMMENT '店铺ID', `product_seq` varchar(64) NOT NULL COMMENT '商品标识', `sku_id` varchar(64) NOT NULL COMMENT '商品skuID', `spu_id` varchar(64) NOT NULL COMMENT '商品spuID', `valid` tinyint(1) DEFAULT '1' COMMENT '是否有效,0无效,1有效', `create_time` datetime DEFAULT '2020-01-01 00:00:00' COMMENT '创建时间', `update_time` datetime DEFAULT '2020-01-01 00:00:00' COMMENT '更新时间', PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4; CREATE TABLE if not exists product_17 ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '自增id',`sale_id` varchar(64) NOT NULL DEFAULT '' COMMENT '卖家ID', `store_id` varchar(64) NOT NULL COMMENT '店铺ID', `product_seq` varchar(64) NOT NULL COMMENT '商品标识', `sku_id` varchar(64) NOT NULL COMMENT '商品skuID', `spu_id` varchar(64) NOT NULL COMMENT '商品spuID', `valid` tinyint(1) DEFAULT '1' COMMENT '是否有效,0无效,1有效', `create_time` datetime DEFAULT '2020-01-01 00:00:00' COMMENT '创建时间', `update_time` datetime DEFAULT '2020-01-01 00:00:00' COMMENT '更新时间', PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4; CREATE TABLE if not exists product_18 ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '自增id',`sale_id` varchar(64) NOT NULL DEFAULT '' COMMENT '卖家ID', `store_id` varchar(64) NOT NULL COMMENT '店铺ID', `product_seq` varchar(64) NOT NULL COMMENT '商品标识', `sku_id` varchar(64) NOT NULL COMMENT '商品skuID', `spu_id` varchar(64) NOT NULL COMMENT '商品spuID', `valid` tinyint(1) DEFAULT '1' COMMENT '是否有效,0无效,1有效', `create_time` datetime DEFAULT '2020-01-01 00:00:00' COMMENT '创建时间', `update_time` datetime DEFAULT '2020-01-01 00:00:00' COMMENT '更新时间', PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4; CREATE TABLE if not exists product_19 ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '自增id',`sale_id` varchar(64) NOT NULL DEFAULT '' COMMENT '卖家ID', `store_id` varchar(64) NOT NULL COMMENT '店铺ID', `product_seq` varchar(64) NOT NULL COMMENT '商品标识', `sku_id` varchar(64) NOT NULL COMMENT '商品skuID', `spu_id` varchar(64) NOT NULL COMMENT '商品spuID', `valid` tinyint(1) DEFAULT '1' COMMENT '是否有效,0无效,1有效', `create_time` datetime DEFAULT '2020-01-01 00:00:00' COMMENT '创建时间', `update_time` datetime DEFAULT '2020-01-01 00:00:00' COMMENT '更新时间', PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4; CREATE TABLE if not exists product_20 ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '自增id',`sale_id` varchar(64) NOT NULL DEFAULT '' COMMENT '卖家ID', `store_id` varchar(64) NOT NULL COMMENT '店铺ID', `product_seq` varchar(64) NOT NULL COMMENT '商品标识', `sku_id` varchar(64) NOT NULL COMMENT '商品skuID', `spu_id` varchar(64) NOT NULL COMMENT '商品spuID', `valid` tinyint(1) DEFAULT '1' COMMENT '是否有效,0无效,1有效', `create_time` datetime DEFAULT '2020-01-01 00:00:00' COMMENT '创建时间', `update_time` datetime DEFAULT '2020-01-01 00:00:00' COMMENT '更新时间', PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4; CREATE TABLE if not exists product_21 ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '自增id',`sale_id` varchar(64) NOT NULL DEFAULT '' COMMENT '卖家ID', `store_id` varchar(64) NOT NULL COMMENT '店铺ID', `product_seq` varchar(64) NOT NULL COMMENT '商品标识', `sku_id` varchar(64) NOT NULL COMMENT '商品skuID', `spu_id` varchar(64) NOT NULL COMMENT '商品spuID', `valid` tinyint(1) DEFAULT '1' COMMENT '是否有效,0无效,1有效', `create_time` datetime DEFAULT '2020-01-01 00:00:00' COMMENT '创建时间', `update_time` datetime DEFAULT '2020-01-01 00:00:00' COMMENT '更新时间', PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4; CREATE TABLE if not exists product_22 ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '自增id',`sale_id` varchar(64) NOT NULL DEFAULT '' COMMENT '卖家ID', `store_id` varchar(64) NOT NULL COMMENT '店铺ID', `product_seq` varchar(64) NOT NULL COMMENT '商品标识', `sku_id` varchar(64) NOT NULL COMMENT '商品skuID', `spu_id` varchar(64) NOT NULL COMMENT '商品spuID', `valid` tinyint(1) DEFAULT '1' COMMENT '是否有效,0无效,1有效', `create_time` datetime DEFAULT '2020-01-01 00:00:00' COMMENT '创建时间', `update_time` datetime DEFAULT '2020-01-01 00:00:00' COMMENT '更新时间', PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4; CREATE TABLE if not exists product_23 ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '自增id',`sale_id` varchar(64) NOT NULL DEFAULT '' COMMENT '卖家ID', `store_id` varchar(64) NOT NULL COMMENT '店铺ID', `product_seq` varchar(64) NOT NULL COMMENT '商品标识', `sku_id` varchar(64) NOT NULL COMMENT '商品skuID', `spu_id` varchar(64) NOT NULL COMMENT '商品spuID', `valid` tinyint(1) DEFAULT '1' COMMENT '是否有效,0无效,1有效', `create_time` datetime DEFAULT '2020-01-01 00:00:00' COMMENT '创建时间', `update_time` datetime DEFAULT '2020-01-01 00:00:00' COMMENT '更新时间', PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4; CREATE TABLE if not exists product_24 ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '自增id',`sale_id` varchar(64) NOT NULL DEFAULT '' COMMENT '卖家ID', `store_id` varchar(64) NOT NULL COMMENT '店铺ID', `product_seq` varchar(64) NOT NULL COMMENT '商品标识', `sku_id` varchar(64) NOT NULL COMMENT '商品skuID', `spu_id` varchar(64) NOT NULL COMMENT '商品spuID', `valid` tinyint(1) DEFAULT '1' COMMENT '是否有效,0无效,1有效', `create_time` datetime DEFAULT '2020-01-01 00:00:00' COMMENT '创建时间', `update_time` datetime DEFAULT '2020-01-01 00:00:00' COMMENT '更新时间', PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4; CREATE TABLE if not exists product_25 ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '自增id',`sale_id` varchar(64) NOT NULL DEFAULT '' COMMENT '卖家ID', `store_id` varchar(64) NOT NULL COMMENT '店铺ID', `product_seq` varchar(64) NOT NULL COMMENT '商品标识', `sku_id` varchar(64) NOT NULL COMMENT '商品skuID', `spu_id` varchar(64) NOT NULL COMMENT '商品spuID', `valid` tinyint(1) DEFAULT '1' COMMENT '是否有效,0无效,1有效', `create_time` datetime DEFAULT '2020-01-01 00:00:00' COMMENT '创建时间', `update_time` datetime DEFAULT '2020-01-01 00:00:00' COMMENT '更新时间', PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4; CREATE TABLE if not exists product_26 ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '自增id',`sale_id` varchar(64) NOT NULL DEFAULT '' COMMENT '卖家ID', `store_id` varchar(64) NOT NULL COMMENT '店铺ID', `product_seq` varchar(64) NOT NULL COMMENT '商品标识', `sku_id` varchar(64) NOT NULL COMMENT '商品skuID', `spu_id` varchar(64) NOT NULL COMMENT '商品spuID', `valid` tinyint(1) DEFAULT '1' COMMENT '是否有效,0无效,1有效', `create_time` datetime DEFAULT '2020-01-01 00:00:00' COMMENT '创建时间', `update_time` datetime DEFAULT '2020-01-01 00:00:00' COMMENT '更新时间', PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4; CREATE TABLE if not exists product_27 ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '自增id',`sale_id` varchar(64) NOT NULL DEFAULT '' COMMENT '卖家ID', `store_id` varchar(64) NOT NULL COMMENT '店铺ID', `product_seq` varchar(64) NOT NULL COMMENT '商品标识', `sku_id` varchar(64) NOT NULL COMMENT '商品skuID', `spu_id` varchar(64) NOT NULL COMMENT '商品spuID', `valid` tinyint(1) DEFAULT '1' COMMENT '是否有效,0无效,1有效', `create_time` datetime DEFAULT '2020-01-01 00:00:00' COMMENT '创建时间', `update_time` datetime DEFAULT '2020-01-01 00:00:00' COMMENT '更新时间', PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4; CREATE TABLE if not exists product_28 ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '自增id',`sale_id` varchar(64) NOT NULL DEFAULT '' COMMENT '卖家ID', `store_id` varchar(64) NOT NULL COMMENT '店铺ID', `product_seq` varchar(64) NOT NULL COMMENT '商品标识', `sku_id` varchar(64) NOT NULL COMMENT '商品skuID', `spu_id` varchar(64) NOT NULL COMMENT '商品spuID', `valid` tinyint(1) DEFAULT '1' COMMENT '是否有效,0无效,1有效', `create_time` datetime DEFAULT '2020-01-01 00:00:00' COMMENT '创建时间', `update_time` datetime DEFAULT '2020-01-01 00:00:00' COMMENT '更新时间', PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4; CREATE TABLE if not exists product_29 ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '自增id',`sale_id` varchar(64) NOT NULL DEFAULT '' COMMENT '卖家ID', `store_id` varchar(64) NOT NULL COMMENT '店铺ID', `product_seq` varchar(64) NOT NULL COMMENT '商品标识', `sku_id` varchar(64) NOT NULL COMMENT '商品skuID', `spu_id` varchar(64) NOT NULL COMMENT '商品spuID', `valid` tinyint(1) DEFAULT '1' COMMENT '是否有效,0无效,1有效', `create_time` datetime DEFAULT '2020-01-01 00:00:00' COMMENT '创建时间', `update_time` datetime DEFAULT '2020-01-01 00:00:00' COMMENT '更新时间', PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4; CREATE TABLE if not exists product_30 ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '自增id',`sale_id` varchar(64) NOT NULL DEFAULT '' COMMENT '卖家ID', `store_id` varchar(64) NOT NULL COMMENT '店铺ID', `product_seq` varchar(64) NOT NULL COMMENT '商品标识', `sku_id` varchar(64) NOT NULL COMMENT '商品skuID', `spu_id` varchar(64) NOT NULL COMMENT '商品spuID', `valid` tinyint(1) DEFAULT '1' COMMENT '是否有效,0无效,1有效', `create_time` datetime DEFAULT '2020-01-01 00:00:00' COMMENT '创建时间', `update_time` datetime DEFAULT '2020-01-01 00:00:00' COMMENT '更新时间', PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4; CREATE TABLE if not exists product_31 ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '自增id',`sale_id` varchar(64) NOT NULL DEFAULT '' COMMENT '卖家ID', `store_id` varchar(64) NOT NULL COMMENT '店铺ID', `product_seq` varchar(64) NOT NULL COMMENT '商品标识', `sku_id` varchar(64) NOT NULL COMMENT '商品skuID', `spu_id` varchar(64) NOT NULL COMMENT '商品spuID', `valid` tinyint(1) DEFAULT '1' COMMENT '是否有效,0无效,1有效', `create_time` datetime DEFAULT '2020-01-01 00:00:00' COMMENT '创建时间', `update_time` datetime DEFAULT '2020-01-01 00:00:00' COMMENT '更新时间', PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4; CREATE TABLE if not exists product_32 ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '自增id',`sale_id` varchar(64) NOT NULL DEFAULT '' COMMENT '卖家ID', `store_id` varchar(64) NOT NULL COMMENT '店铺ID', `product_seq` varchar(64) NOT NULL COMMENT '商品标识', `sku_id` varchar(64) NOT NULL COMMENT '商品skuID', `spu_id` varchar(64) NOT NULL COMMENT '商品spuID', `valid` tinyint(1) DEFAULT '1' COMMENT '是否有效,0无效,1有效', `create_time` datetime DEFAULT '2020-01-01 00:00:00' COMMENT '创建时间', `update_time` datetime DEFAULT '2020-01-01 00:00:00' COMMENT '更新时间', PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4; CREATE TABLE if not exists product_33 ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '自增id',`sale_id` varchar(64) NOT NULL DEFAULT '' COMMENT '卖家ID', `store_id` varchar(64) NOT NULL COMMENT '店铺ID', `product_seq` varchar(64) NOT NULL COMMENT '商品标识', `sku_id` varchar(64) NOT NULL COMMENT '商品skuID', `spu_id` varchar(64) NOT NULL COMMENT '商品spuID', `valid` tinyint(1) DEFAULT '1' COMMENT '是否有效,0无效,1有效', `create_time` datetime DEFAULT '2020-01-01 00:00:00' COMMENT '创建时间', `update_time` datetime DEFAULT '2020-01-01 00:00:00' COMMENT '更新时间', PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4; CREATE TABLE if not exists product_34 ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '自增id',`sale_id` varchar(64) NOT NULL DEFAULT '' COMMENT '卖家ID', `store_id` varchar(64) NOT NULL COMMENT '店铺ID', `product_seq` varchar(64) NOT NULL COMMENT '商品标识', `sku_id` varchar(64) NOT NULL COMMENT '商品skuID', `spu_id` varchar(64) NOT NULL COMMENT '商品spuID', `valid` tinyint(1) DEFAULT '1' COMMENT '是否有效,0无效,1有效', `create_time` datetime DEFAULT '2020-01-01 00:00:00' COMMENT '创建时间', `update_time` datetime DEFAULT '2020-01-01 00:00:00' COMMENT '更新时间', PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4; CREATE TABLE if not exists product_35 ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '自增id',`sale_id` varchar(64) NOT NULL DEFAULT '' COMMENT '卖家ID', `store_id` varchar(64) NOT NULL COMMENT '店铺ID', `product_seq` varchar(64) NOT NULL COMMENT '商品标识', `sku_id` varchar(64) NOT NULL COMMENT '商品skuID', `spu_id` varchar(64) NOT NULL COMMENT '商品spuID', `valid` tinyint(1) DEFAULT '1' COMMENT '是否有效,0无效,1有效', `create_time` datetime DEFAULT '2020-01-01 00:00:00' COMMENT '创建时间', `update_time` datetime DEFAULT '2020-01-01 00:00:00' COMMENT '更新时间', PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4; CREATE TABLE if not exists product_36 ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '自增id',`sale_id` varchar(64) NOT NULL DEFAULT '' COMMENT '卖家ID', `store_id` varchar(64) NOT NULL COMMENT '店铺ID', `product_seq` varchar(64) NOT NULL COMMENT '商品标识', `sku_id` varchar(64) NOT NULL COMMENT '商品skuID', `spu_id` varchar(64) NOT NULL COMMENT '商品spuID', `valid` tinyint(1) DEFAULT '1' COMMENT '是否有效,0无效,1有效', `create_time` datetime DEFAULT '2020-01-01 00:00:00' COMMENT '创建时间', `update_time` datetime DEFAULT '2020-01-01 00:00:00' COMMENT '更新时间', PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4; CREATE TABLE if not exists product_37 ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '自增id',`sale_id` varchar(64) NOT NULL DEFAULT '' COMMENT '卖家ID', `store_id` varchar(64) NOT NULL COMMENT '店铺ID', `product_seq` varchar(64) NOT NULL COMMENT '商品标识', `sku_id` varchar(64) NOT NULL COMMENT '商品skuID', `spu_id` varchar(64) NOT NULL COMMENT '商品spuID', `valid` tinyint(1) DEFAULT '1' COMMENT '是否有效,0无效,1有效', `create_time` datetime DEFAULT '2020-01-01 00:00:00' COMMENT '创建时间', `update_time` datetime DEFAULT '2020-01-01 00:00:00' COMMENT '更新时间', PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4; CREATE TABLE if not exists product_38 ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '自增id',`sale_id` varchar(64) NOT NULL DEFAULT '' COMMENT '卖家ID', `store_id` varchar(64) NOT NULL COMMENT '店铺ID', `product_seq` varchar(64) NOT NULL COMMENT '商品标识', `sku_id` varchar(64) NOT NULL COMMENT '商品skuID', `spu_id` varchar(64) NOT NULL COMMENT '商品spuID', `valid` tinyint(1) DEFAULT '1' COMMENT '是否有效,0无效,1有效', `create_time` datetime DEFAULT '2020-01-01 00:00:00' COMMENT '创建时间', `update_time` datetime DEFAULT '2020-01-01 00:00:00' COMMENT '更新时间', PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4; CREATE TABLE if not exists product_39 ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '自增id',`sale_id` varchar(64) NOT NULL DEFAULT '' COMMENT '卖家ID', `store_id` varchar(64) NOT NULL COMMENT '店铺ID', `product_seq` varchar(64) NOT NULL COMMENT '商品标识', `sku_id` varchar(64) NOT NULL COMMENT '商品skuID', `spu_id` varchar(64) NOT NULL COMMENT '商品spuID', `valid` tinyint(1) DEFAULT '1' COMMENT '是否有效,0无效,1有效', `create_time` datetime DEFAULT '2020-01-01 00:00:00' COMMENT '创建时间', `update_time` datetime DEFAULT '2020-01-01 00:00:00' COMMENT '更新时间', PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4; CREATE TABLE if not exists product_40 ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '自增id',`sale_id` varchar(64) NOT NULL DEFAULT '' COMMENT '卖家ID', `store_id` varchar(64) NOT NULL COMMENT '店铺ID', `product_seq` varchar(64) NOT NULL COMMENT '商品标识', `sku_id` varchar(64) NOT NULL COMMENT '商品skuID', `spu_id` varchar(64) NOT NULL COMMENT '商品spuID', `valid` tinyint(1) DEFAULT '1' COMMENT '是否有效,0无效,1有效', `create_time` datetime DEFAULT '2020-01-01 00:00:00' COMMENT '创建时间', `update_time` datetime DEFAULT '2020-01-01 00:00:00' COMMENT '更新时间', PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4; CREATE TABLE if not exists product_41 ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '自增id',`sale_id` varchar(64) NOT NULL DEFAULT '' COMMENT '卖家ID', `store_id` varchar(64) NOT NULL COMMENT '店铺ID', `product_seq` varchar(64) NOT NULL COMMENT '商品标识', `sku_id` varchar(64) NOT NULL COMMENT '商品skuID', `spu_id` varchar(64) NOT NULL COMMENT '商品spuID', `valid` tinyint(1) DEFAULT '1' COMMENT '是否有效,0无效,1有效', `create_time` datetime DEFAULT '2020-01-01 00:00:00' COMMENT '创建时间', `update_time` datetime DEFAULT '2020-01-01 00:00:00' COMMENT '更新时间', PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4; CREATE TABLE if not exists product_42 ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '自增id',`sale_id` varchar(64) NOT NULL DEFAULT '' COMMENT '卖家ID', `store_id` varchar(64) NOT NULL COMMENT '店铺ID', `product_seq` varchar(64) NOT NULL COMMENT '商品标识', `sku_id` varchar(64) NOT NULL COMMENT '商品skuID', `spu_id` varchar(64) NOT NULL COMMENT '商品spuID', `valid` tinyint(1) DEFAULT '1' COMMENT '是否有效,0无效,1有效', `create_time` datetime DEFAULT '2020-01-01 00:00:00' COMMENT '创建时间', `update_time` datetime DEFAULT '2020-01-01 00:00:00' COMMENT '更新时间', PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4; CREATE TABLE if not exists product_43 ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '自增id',`sale_id` varchar(64) NOT NULL DEFAULT '' COMMENT '卖家ID', `store_id` varchar(64) NOT NULL COMMENT '店铺ID', `product_seq` varchar(64) NOT NULL COMMENT '商品标识', `sku_id` varchar(64) NOT NULL COMMENT '商品skuID', `spu_id` varchar(64) NOT NULL COMMENT '商品spuID', `valid` tinyint(1) DEFAULT '1' COMMENT '是否有效,0无效,1有效', `create_time` datetime DEFAULT '2020-01-01 00:00:00' COMMENT '创建时间', `update_time` datetime DEFAULT '2020-01-01 00:00:00' COMMENT '更新时间', PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4; CREATE TABLE if not exists product_44 ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '自增id',`sale_id` varchar(64) NOT NULL DEFAULT '' COMMENT '卖家ID', `store_id` varchar(64) NOT NULL COMMENT '店铺ID', `product_seq` varchar(64) NOT NULL COMMENT '商品标识', `sku_id` varchar(64) NOT NULL COMMENT '商品skuID', `spu_id` varchar(64) NOT NULL COMMENT '商品spuID', `valid` tinyint(1) DEFAULT '1' COMMENT '是否有效,0无效,1有效', `create_time` datetime DEFAULT '2020-01-01 00:00:00' COMMENT '创建时间', `update_time` datetime DEFAULT '2020-01-01 00:00:00' COMMENT '更新时间', PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4; CREATE TABLE if not exists product_45 ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '自增id',`sale_id` varchar(64) NOT NULL DEFAULT '' COMMENT '卖家ID', `store_id` varchar(64) NOT NULL COMMENT '店铺ID', `product_seq` varchar(64) NOT NULL COMMENT '商品标识', `sku_id` varchar(64) NOT NULL COMMENT '商品skuID', `spu_id` varchar(64) NOT NULL COMMENT '商品spuID', `valid` tinyint(1) DEFAULT '1' COMMENT '是否有效,0无效,1有效', `create_time` datetime DEFAULT '2020-01-01 00:00:00' COMMENT '创建时间', `update_time` datetime DEFAULT '2020-01-01 00:00:00' COMMENT '更新时间', PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4; CREATE TABLE if not exists product_46 ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '自增id',`sale_id` varchar(64) NOT NULL DEFAULT '' COMMENT '卖家ID', `store_id` varchar(64) NOT NULL COMMENT '店铺ID', `product_seq` varchar(64) NOT NULL COMMENT '商品标识', `sku_id` varchar(64) NOT NULL COMMENT '商品skuID', `spu_id` varchar(64) NOT NULL COMMENT '商品spuID', `valid` tinyint(1) DEFAULT '1' COMMENT '是否有效,0无效,1有效', `create_time` datetime DEFAULT '2020-01-01 00:00:00' COMMENT '创建时间', `update_time` datetime DEFAULT '2020-01-01 00:00:00' COMMENT '更新时间', PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4; CREATE TABLE if not exists product_47 ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '自增id',`sale_id` varchar(64) NOT NULL DEFAULT '' COMMENT '卖家ID', `store_id` varchar(64) NOT NULL COMMENT '店铺ID', `product_seq` varchar(64) NOT NULL COMMENT '商品标识', `sku_id` varchar(64) NOT NULL COMMENT '商品skuID', `spu_id` varchar(64) NOT NULL COMMENT '商品spuID', `valid` tinyint(1) DEFAULT '1' COMMENT '是否有效,0无效,1有效', `create_time` datetime DEFAULT '2020-01-01 00:00:00' COMMENT '创建时间', `update_time` datetime DEFAULT '2020-01-01 00:00:00' COMMENT '更新时间', PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4; CREATE TABLE if not exists product_48 ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '自增id',`sale_id` varchar(64) NOT NULL DEFAULT '' COMMENT '卖家ID', `store_id` varchar(64) NOT NULL COMMENT '店铺ID', `product_seq` varchar(64) NOT NULL COMMENT '商品标识', `sku_id` varchar(64) NOT NULL COMMENT '商品skuID', `spu_id` varchar(64) NOT NULL COMMENT '商品spuID', `valid` tinyint(1) DEFAULT '1' COMMENT '是否有效,0无效,1有效', `create_time` datetime DEFAULT '2020-01-01 00:00:00' COMMENT '创建时间', `update_time` datetime DEFAULT '2020-01-01 00:00:00' COMMENT '更新时间', PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4; CREATE TABLE if not exists product_49 ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '自增id',`sale_id` varchar(64) NOT NULL DEFAULT '' COMMENT '卖家ID', `store_id` varchar(64) NOT NULL COMMENT '店铺ID', `product_seq` varchar(64) NOT NULL COMMENT '商品标识', `sku_id` varchar(64) NOT NULL COMMENT '商品skuID', `spu_id` varchar(64) NOT NULL COMMENT '商品spuID', `valid` tinyint(1) DEFAULT '1' COMMENT '是否有效,0无效,1有效', `create_time` datetime DEFAULT '2020-01-01 00:00:00' COMMENT '创建时间', `update_time` datetime DEFAULT '2020-01-01 00:00:00' COMMENT '更新时间', PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4; CREATE TABLE if not exists product_50 ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '自增id',`sale_id` varchar(64) NOT NULL DEFAULT '' COMMENT '卖家ID', `store_id` varchar(64) NOT NULL COMMENT '店铺ID', `product_seq` varchar(64) NOT NULL COMMENT '商品标识', `sku_id` varchar(64) NOT NULL COMMENT '商品skuID', `spu_id` varchar(64) NOT NULL COMMENT '商品spuID', `valid` tinyint(1) DEFAULT '1' COMMENT '是否有效,0无效,1有效', `create_time` datetime DEFAULT '2020-01-01 00:00:00' COMMENT '创建时间', `update_time` datetime DEFAULT '2020-01-01 00:00:00' COMMENT '更新时间', PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4; CREATE TABLE if not exists product_51 ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '自增id',`sale_id` varchar(64) NOT NULL DEFAULT '' COMMENT '卖家ID', `store_id` varchar(64) NOT NULL COMMENT '店铺ID', `product_seq` varchar(64) NOT NULL COMMENT '商品标识', `sku_id` varchar(64) NOT NULL COMMENT '商品skuID', `spu_id` varchar(64) NOT NULL COMMENT '商品spuID', `valid` tinyint(1) DEFAULT '1' COMMENT '是否有效,0无效,1有效', `create_time` datetime DEFAULT '2020-01-01 00:00:00' COMMENT '创建时间', `update_time` datetime DEFAULT '2020-01-01 00:00:00' COMMENT '更新时间', PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4; CREATE TABLE if not exists product_52 ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '自增id',`sale_id` varchar(64) NOT NULL DEFAULT '' COMMENT '卖家ID', `store_id` varchar(64) NOT NULL COMMENT '店铺ID', `product_seq` varchar(64) NOT NULL COMMENT '商品标识', `sku_id` varchar(64) NOT NULL COMMENT '商品skuID', `spu_id` varchar(64) NOT NULL COMMENT '商品spuID', `valid` tinyint(1) DEFAULT '1' COMMENT '是否有效,0无效,1有效', `create_time` datetime DEFAULT '2020-01-01 00:00:00' COMMENT '创建时间', `update_time` datetime DEFAULT '2020-01-01 00:00:00' COMMENT '更新时间', PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4; CREATE TABLE if not exists product_53 ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '自增id',`sale_id` varchar(64) NOT NULL DEFAULT '' COMMENT '卖家ID', `store_id` varchar(64) NOT NULL COMMENT '店铺ID', `product_seq` varchar(64) NOT NULL COMMENT '商品标识', `sku_id` varchar(64) NOT NULL COMMENT '商品skuID', `spu_id` varchar(64) NOT NULL COMMENT '商品spuID', `valid` tinyint(1) DEFAULT '1' COMMENT '是否有效,0无效,1有效', `create_time` datetime DEFAULT '2020-01-01 00:00:00' COMMENT '创建时间', `update_time` datetime DEFAULT '2020-01-01 00:00:00' COMMENT '更新时间', PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4; CREATE TABLE if not exists product_54 ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '自增id',`sale_id` varchar(64) NOT NULL DEFAULT '' COMMENT '卖家ID', `store_id` varchar(64) NOT NULL COMMENT '店铺ID', `product_seq` varchar(64) NOT NULL COMMENT '商品标识', `sku_id` varchar(64) NOT NULL COMMENT '商品skuID', `spu_id` varchar(64) NOT NULL COMMENT '商品spuID', `valid` tinyint(1) DEFAULT '1' COMMENT '是否有效,0无效,1有效', `create_time` datetime DEFAULT '2020-01-01 00:00:00' COMMENT '创建时间', `update_time` datetime DEFAULT '2020-01-01 00:00:00' COMMENT '更新时间', PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4; CREATE TABLE if not exists product_55 ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '自增id',`sale_id` varchar(64) NOT NULL DEFAULT '' COMMENT '卖家ID', `store_id` varchar(64) NOT NULL COMMENT '店铺ID', `product_seq` varchar(64) NOT NULL COMMENT '商品标识', `sku_id` varchar(64) NOT NULL COMMENT '商品skuID', `spu_id` varchar(64) NOT NULL COMMENT '商品spuID', `valid` tinyint(1) DEFAULT '1' COMMENT '是否有效,0无效,1有效', `create_time` datetime DEFAULT '2020-01-01 00:00:00' COMMENT '创建时间', `update_time` datetime DEFAULT '2020-01-01 00:00:00' COMMENT '更新时间', PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4; CREATE TABLE if not exists product_56 ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '自增id',`sale_id` varchar(64) NOT NULL DEFAULT '' COMMENT '卖家ID', `store_id` varchar(64) NOT NULL COMMENT '店铺ID', `product_seq` varchar(64) NOT NULL COMMENT '商品标识', `sku_id` varchar(64) NOT NULL COMMENT '商品skuID', `spu_id` varchar(64) NOT NULL COMMENT '商品spuID', `valid` tinyint(1) DEFAULT '1' COMMENT '是否有效,0无效,1有效', `create_time` datetime DEFAULT '2020-01-01 00:00:00' COMMENT '创建时间', `update_time` datetime DEFAULT '2020-01-01 00:00:00' COMMENT '更新时间', PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4; CREATE TABLE if not exists product_57 ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '自增id',`sale_id` varchar(64) NOT NULL DEFAULT '' COMMENT '卖家ID', `store_id` varchar(64) NOT NULL COMMENT '店铺ID', `product_seq` varchar(64) NOT NULL COMMENT '商品标识', `sku_id` varchar(64) NOT NULL COMMENT '商品skuID', `spu_id` varchar(64) NOT NULL COMMENT '商品spuID', `valid` tinyint(1) DEFAULT '1' COMMENT '是否有效,0无效,1有效', `create_time` datetime DEFAULT '2020-01-01 00:00:00' COMMENT '创建时间', `update_time` datetime DEFAULT '2020-01-01 00:00:00' COMMENT '更新时间', PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4; CREATE TABLE if not exists product_58 ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '自增id',`sale_id` varchar(64) NOT NULL DEFAULT '' COMMENT '卖家ID', `store_id` varchar(64) NOT NULL COMMENT '店铺ID', `product_seq` varchar(64) NOT NULL COMMENT '商品标识', `sku_id` varchar(64) NOT NULL COMMENT '商品skuID', `spu_id` varchar(64) NOT NULL COMMENT '商品spuID', `valid` tinyint(1) DEFAULT '1' COMMENT '是否有效,0无效,1有效', `create_time` datetime DEFAULT '2020-01-01 00:00:00' COMMENT '创建时间', `update_time` datetime DEFAULT '2020-01-01 00:00:00' COMMENT '更新时间', PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4; CREATE TABLE if not exists product_59 ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '自增id',`sale_id` varchar(64) NOT NULL DEFAULT '' COMMENT '卖家ID', `store_id` varchar(64) NOT NULL COMMENT '店铺ID', `product_seq` varchar(64) NOT NULL COMMENT '商品标识', `sku_id` varchar(64) NOT NULL COMMENT '商品skuID', `spu_id` varchar(64) NOT NULL COMMENT '商品spuID', `valid` tinyint(1) DEFAULT '1' COMMENT '是否有效,0无效,1有效', `create_time` datetime DEFAULT '2020-01-01 00:00:00' COMMENT '创建时间', `update_time` datetime DEFAULT '2020-01-01 00:00:00' COMMENT '更新时间', PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4; CREATE TABLE if not exists product_60 ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '自增id',`sale_id` varchar(64) NOT NULL DEFAULT '' COMMENT '卖家ID', `store_id` varchar(64) NOT NULL COMMENT '店铺ID', `product_seq` varchar(64) NOT NULL COMMENT '商品标识', `sku_id` varchar(64) NOT NULL COMMENT '商品skuID', `spu_id` varchar(64) NOT NULL COMMENT '商品spuID', `valid` tinyint(1) DEFAULT '1' COMMENT '是否有效,0无效,1有效', `create_time` datetime DEFAULT '2020-01-01 00:00:00' COMMENT '创建时间', `update_time` datetime DEFAULT '2020-01-01 00:00:00' COMMENT '更新时间', PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4; CREATE TABLE if not exists product_61 ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '自增id',`sale_id` varchar(64) NOT NULL DEFAULT '' COMMENT '卖家ID', `store_id` varchar(64) NOT NULL COMMENT '店铺ID', `product_seq` varchar(64) NOT NULL COMMENT '商品标识', `sku_id` varchar(64) NOT NULL COMMENT '商品skuID', `spu_id` varchar(64) NOT NULL COMMENT '商品spuID', `valid` tinyint(1) DEFAULT '1' COMMENT '是否有效,0无效,1有效', `create_time` datetime DEFAULT '2020-01-01 00:00:00' COMMENT '创建时间', `update_time` datetime DEFAULT '2020-01-01 00:00:00' COMMENT '更新时间', PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4; CREATE TABLE if not exists product_62 ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '自增id',`sale_id` varchar(64) NOT NULL DEFAULT '' COMMENT '卖家ID', `store_id` varchar(64) NOT NULL COMMENT '店铺ID', `product_seq` varchar(64) NOT NULL COMMENT '商品标识', `sku_id` varchar(64) NOT NULL COMMENT '商品skuID', `spu_id` varchar(64) NOT NULL COMMENT '商品spuID', `valid` tinyint(1) DEFAULT '1' COMMENT '是否有效,0无效,1有效', `create_time` datetime DEFAULT '2020-01-01 00:00:00' COMMENT '创建时间', `update_time` datetime DEFAULT '2020-01-01 00:00:00' COMMENT '更新时间', PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4; CREATE TABLE if not exists product_63 ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '自增id',`sale_id` varchar(64) NOT NULL DEFAULT '' COMMENT '卖家ID', `store_id` varchar(64) NOT NULL COMMENT '店铺ID', `product_seq` varchar(64) NOT NULL COMMENT '商品标识', `sku_id` varchar(64) NOT NULL COMMENT '商品skuID', `spu_id` varchar(64) NOT NULL COMMENT '商品spuID', `valid` tinyint(1) DEFAULT '1' COMMENT '是否有效,0无效,1有效', `create_time` datetime DEFAULT '2020-01-01 00:00:00' COMMENT '创建时间', `update_time` datetime DEFAULT '2020-01-01 00:00:00' COMMENT '更新时间', PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4;
四、基于springboot实战分库分表搭建
- 分库分表实战
- 引入pom依赖
- 配置yml或者properties文件
- 配置datasource config
- 配置分库分表策略
实际操作
加入pom文件
<dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <!-- sharding-jdbc --> <dependency> <groupId>com.dangdang</groupId> <artifactId>sharding-jdbc-core</artifactId> <version>1.5.4</version> </dependency>
修改application.yml配置文件
product0: driver-class-name: com.mysql.jdbc.Driver #基本属性 url: jdbc:mysql://ip:3306/product0?charset=utf8mb4&useSSL=false username: root password: mima databaseName: product0 product1: driver-class-name: com.mysql.jdbc.Driver #基本属性 url: jdbc:mysql://ip:3306/product1?charset=utf8mb4&useSSL=false username: root password: mima databaseName: product1
这里我们看一下数据库结构图吧,避免有些模糊、抽象操作!
配置conf类
Product0Config
点击查看完整内容
import com.alibaba.druid.pool.DruidDataSource; import lombok.Data; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.stereotype.Component; import javax.sql.DataSource; @Data @ConfigurationProperties(prefix = "product0") @Component public class Product0Config { private String url; private String username; private String password; private String driverClassName; private String databaseName; public DataSource createDataSource() { DruidDataSource result = new DruidDataSource(); result.setDriverClassName(getDriverClassName()); result.setUrl(getUrl()); result.setUsername(getUsername()); result.setPassword(getPassword()); return result; } }
Product1Config
点击查看完整内容
import com.alibaba.druid.pool.DruidDataSource; import lombok.Data; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.stereotype.Component; import javax.sql.DataSource; @Data @ConfigurationProperties(prefix = "product1") @Component public class Product1Config { private String url; private String username; private String password; private String driverClassName; private String databaseName; public DataSource createDataSource() { DruidDataSource result = new DruidDataSource(); result.setDriverClassName(getDriverClassName()); result.setUrl(getUrl()); result.setUsername(getUsername()); result.setPassword(getPassword()); return result; } }
DataSourceConfig
点击查看完整内容
package com.xdclass.mysql.configdata; import com.dangdang.ddframe.rdb.sharding.api.ShardingDataSourceFactory; import com.dangdang.ddframe.rdb.sharding.api.rule.DataSourceRule; import com.dangdang.ddframe.rdb.sharding.api.rule.ShardingRule; import com.dangdang.ddframe.rdb.sharding.api.rule.TableRule; import com.dangdang.ddframe.rdb.sharding.api.strategy.database.DatabaseShardingStrategy; import com.dangdang.ddframe.rdb.sharding.api.strategy.table.TableShardingStrategy; import com.dangdang.ddframe.rdb.sharding.keygen.DefaultKeyGenerator; import com.dangdang.ddframe.rdb.sharding.keygen.KeyGenerator; import com.google.common.collect.Maps; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import javax.sql.DataSource; import java.sql.SQLException; import java.util.Arrays; import java.util.Collections; import java.util.Map; @Configuration public class DataSourceConfig { @Autowired private Product0Config database0Config; @Autowired private Product1Config database1Config; @Autowired private DatabaseShardingAlgorithm databaseShardingAlgorithm; @Autowired private TableShardingAlgorithm tableShardingAlgorithm; @Bean public DataSource getDataSource() throws SQLException { return buildDataSource(); } private DataSource buildDataSource() throws SQLException { //分库设置 Map<String, DataSource> dataSourceMap = Maps.newHashMapWithExpectedSize(2); //添加两个数据库database0和database1 dataSourceMap.put(database0Config.getDatabaseName(), database0Config.createDataSource()); dataSourceMap.put(database1Config.getDatabaseName(), database1Config.createDataSource()); //设置默认数据库 DataSourceRule dataSourceRule = new DataSourceRule(dataSourceMap, database0Config.getDatabaseName()); //分表设置,大致思想就是将查询虚拟表Goods根据一定规则映射到真实表中去 TableRule orderTableRule = TableRule.builder("product") .actualTables(Arrays.asList("product_0", "product_1", "product_2", "product_3", "product_4", "product_5", "product_6", "product_7", "product_8", "product_9", "product_10", "product_11", "product_12", "product_13", "product_14", "product_15", "product_16", "product_17", "product_18", "product_19", "product_20", "product_21", "product_22", "product_23", "product_24", "product_25", "product_26", "product_27", "product_28", "product_29", "product_30", "product_31", "product_32", "product_33", "product_34", "product_35", "product_36", "product_37", "product_38", "product_39", "product_40", "product_41", "product_42", "product_43", "product_44", "product_45", "product_46", "product_47", "product_48", "product_49", "product_50", "product_51", "product_52", "product_53", "product_54", "product_55", "product_56", "product_57", "product_58", "product_59", "product_60", "product_61", "product_62", "product_63")) .dataSourceRule(dataSourceRule) .build(); //分库分表策略 ShardingRule shardingRule = ShardingRule.builder() .dataSourceRule(dataSourceRule) .tableRules(Collections.singletonList(orderTableRule)) .databaseShardingStrategy(new DatabaseShardingStrategy("store_id", databaseShardingAlgorithm)) .tableShardingStrategy(new TableShardingStrategy("store_id", tableShardingAlgorithm)).build(); return ShardingDataSourceFactory.createDataSource(shardingRule); } @Bean public KeyGenerator keyGenerator() { return new DefaultKeyGenerator(); } }
配置分库分表策略
TableShardingAlgorithm
点击查看完整内容
package com.xdclass.mysql.configdata; import com.dangdang.ddframe.rdb.sharding.api.ShardingValue; import com.dangdang.ddframe.rdb.sharding.api.strategy.table.SingleKeyTableShardingAlgorithm; import com.google.common.collect.Range; import org.springframework.stereotype.Component; import java.util.Collection; import java.util.LinkedHashSet; @Component public class TableShardingAlgorithm implements SingleKeyTableShardingAlgorithm<Long> { @Override public String doEqualSharding(final Collection<String> tableNames, final ShardingValue<Long> shardingValue) { for (String each : tableNames) { if (each.endsWith(shardingValue.getValue() % 64 + "")) { return each; } } throw new IllegalArgumentException(); } @Override public Collection<String> doInSharding(final Collection<String> tableNames, final ShardingValue<Long> shardingValue) { Collection<String> result = new LinkedHashSet<>(tableNames.size()); for (Long value : shardingValue.getValues()) { for (String tableName : tableNames) { if (tableName.endsWith(value % 64 + "")) { result.add(tableName); } } } return result; } @Override public Collection<String> doBetweenSharding(final Collection<String> tableNames, final ShardingValue<Long> shardingValue) { Collection<String> result = new LinkedHashSet<>(tableNames.size()); Range<Long> range = shardingValue.getValueRange(); for (Long i = range.lowerEndpoint(); i <= range.upperEndpoint(); i++) { for (String each : tableNames) { if (each.endsWith(i % 64 + "")) { result.add(each); } } } return result; } }
DatabaseShardingAlgorithm
点击查看完整内容
package com.xdclass.mysql.configdata; import com.dangdang.ddframe.rdb.sharding.api.ShardingValue; import com.dangdang.ddframe.rdb.sharding.api.strategy.database.SingleKeyDatabaseShardingAlgorithm; import com.google.common.collect.Range; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import java.util.Collection; import java.util.LinkedHashSet; @Component public class DatabaseShardingAlgorithm implements SingleKeyDatabaseShardingAlgorithm<Long> { @Autowired private Product0Config database0Config; @Autowired private Product1Config database1Config; @Override public String doEqualSharding(Collection<String> availableTargetNames, ShardingValue<Long> shardingValue) { Long value = shardingValue.getValue(); if (value%2==0) { return database0Config.getDatabaseName(); } else { return database1Config.getDatabaseName(); } } @Override public Collection<String> doInSharding(Collection<String> availableTargetNames, ShardingValue<Long> shardingValue) { Collection<String> result = new LinkedHashSet<>(availableTargetNames.size()); for (Long value : shardingValue.getValues()) { if (value%2==0) { result.add(database0Config.getDatabaseName()); } else { result.add(database1Config.getDatabaseName()); } } return result; } @Override public Collection<String> doBetweenSharding(Collection<String> availableTargetNames, ShardingValue<Long> shardingValue) { Collection<String> result = new LinkedHashSet<>(availableTargetNames.size()); Range<Long> range = shardingValue.getValueRange(); for (Long value = range.lowerEndpoint(); value <= range.upperEndpoint(); value++) { if (value%2==0) { result.add(database0Config.getDatabaseName()); } else { result.add(database1Config.getDatabaseName()); } } return result; } }
利用generatorConfig-xdclass.xml生成我们需要的类
generatorConfig-xdclass.xml
点击查看完整内容
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE generatorConfiguration PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN" "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd" > <generatorConfiguration> <context id="xdclass" targetRuntime="MyBatis3"> <!-- 用反引号`包裹,默认是双引号"--> <property name="autoDelimitKeywords" value="true"/> <property name="beginningDelimiter" value="`"/> <property name="endingDelimiter" value="`"/> <property name="javaFileEncoding" value="UTF-8"/> <plugin type="org.mybatis.generator.plugins.EqualsHashCodePlugin"/> <plugin type="org.mybatis.generator.plugins.ToStringPlugin"/> <plugin type="org.mybatis.generator.plugins.MapperAnnotationPlugin"/> <plugin type="org.mybatis.generator.plugins.UnmergeableXmlMappersPlugin"/> <jdbcConnection driverClass="com.mysql.jdbc.Driver" connectionURL="jdbc:mysql://ip:3306/product0?useUnicode=true&characterEncoding=UTF-8" userId="root" password="mima"> </jdbcConnection> <!-- java type resolver --> <javaTypeResolver> <property name="forceBigDecimals" value="false"/> <property name="useJSR310Types" value="true"/> </javaTypeResolver> <!-- gem entity --> <javaModelGenerator targetPackage="com.xdclass.mysql.model" targetProject="./src/main/java"> <property name="enableSubPackages" value="true"/> <property name="trimStrings" value="false"/> </javaModelGenerator> <!-- gem sql map --> <sqlMapGenerator targetPackage="mappers/xdclass/generated" targetProject="./src/main/resources/"> <property name="enableSubPackages" value="true"/> </sqlMapGenerator> <!-- gem mapper --> <javaClientGenerator type="XMLMAPPER" targetPackage="com.xdclass.mysql.persist.mapper.generated" targetProject="./src/main/java"> <property name="enableSubPackages" value="true"/> </javaClientGenerator> <table tableName="user" domainObjectName="User" mapperName="UserMapper" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false" enableDeleteByPrimaryKey="true" enableInsert="true" enableSelectByPrimaryKey="true" enableUpdateByPrimaryKey="true"> <columnOverride column="is_default_type" property="defaultType" javaType="java.lang.Boolean" jdbcType="TINYINT"/> </table> <table tableName="product" domainObjectName="Product" mapperName="ProductMapper" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false" enableDeleteByPrimaryKey="true" enableInsert="true" enableSelectByPrimaryKey="true" enableUpdateByPrimaryKey="true"> <columnOverride column="is_default_type" property="defaultType" javaType="java.lang.Boolean" jdbcType="TINYINT"/> </table> </context> </generatorConfiguration>
主要需要修改的地方如下图
我们需要的就是他
可以测试一下了
ProductController
点击查看完整内容
import com.xdclass.mysql.constant.RestItemResult; import com.xdclass.mysql.domain.User; import com.xdclass.mysql.model.Product; import com.xdclass.mysql.persist.mapper.generated.ProductMapper; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; import java.time.LocalDateTime; @RestController @RequestMapping("/product") public class ProductController { @Resource private ProductMapper productMapper; @RequestMapping(value = "/add", method = RequestMethod.GET) public String add() { for (int i=10000;i<11000;i++){ Product product = new Product(); product.setProductSeq("productSeq" + i); product.setCreateTime(LocalDateTime.now()); product.setId((long) i); product.setSkuId("skuId" + i); product.setSpuId("spuId" + i); product.setSaleId("saleId" + i); product.setStoreId((long) i); product.setUpdateTime(LocalDateTime.now()); productMapper.insertSelective(product); } return "success"; } @GetMapping("chaxun") public RestItemResult<Product> quene(Long id) { RestItemResult<Product> result = new RestItemResult<>(); Product product = productMapper.selectByPrimaryKey(id); if (product != null) { result.setItem(product); result.setResult("success"); } else { result.setMessage("查询用户失败"); result.setResult("failure"); } return result; } }
测试结果如下图
五、分布式场景怎么保证ID唯一性?
讨论分布式场景ID怎么生成?
- 分布式场景ID生成分析
- 全局唯一:必须保证ID是全局性唯一的,基本要求
- 高性能:高可用低延时,ID生成响应要块,否则会成为业务瓶颈
- 高可用:100%的可用性是骗人的,但是也要无限接近于100%的可用性 99.9% 99.99%
- 好接入:要秉着拿来即用的设计原则,在系统设计和实现上要尽可能的简单
Zookeeper 一致性
六、分库分表ID唯一性实现手段
讨论分布式场景ID怎么生成?
- 号段模式是当下分布式ID生成器的主流实现方式之一,号段模式可以理解为从数据库批量的获取自增ID,每次自动生成一个号段,例如 (1,1000] 代表1000个ID,具体的业务服务将本号段,生成1~1000的自增ID并加载到内存(分布式缓存)
- 雪花算法(Snowflake)是twitter公司内部分布式项目采用的ID生成算法,开源后广受国内大厂的好评,在该算法影响下各大公司相继开发出各具特色的分布式生成器 如:部署10台web服务,同一时间点,第一台机器生成uuid+00 第二台机器生成uuid+01 第三台机器生成uuid+02
- 雪花算法生成原则和原理
- 使用41bit作为毫秒数,10bit作为机器的ID(5个bit是数据中心,5个bit的机器ID),12bit作为毫秒内的流水号(意味着每个节点在每毫秒可以产生 4096 个 ID),最后还有一个符号位,永远是0
七、mysql分库分表非partition key检索
解析分库分表遇到的问题,非partition key如何发起检索
- 分库分表是根据partition key做数据表下标定位,但在某些场景需要用到非partition key检索数据,就会遇到问题
- 无法直接找到具体连到哪个库和哪个表
- 对于单个非partition key查询一般可以根据业务场景需要解决方案
- 映射法检索,通过非partition key找到对应的partition key,再根据partition key做hash找到对应库表
- 优点:方案简单清晰
- 缺点:需要检索两次数据库,消耗IO较大
- 基因法检索,在存储非partition key时冗余一个字段用于预埋能找到对应的partition key,再根据partition key做hash找到对应库表
- 优点:建立冗余字段,只需要解析基因即可
- 缺点:需要设置基因解析逻辑
- ES检索,根据非partition key作为条件建立起检索,后续查询直接走异构系统ES即可,性能和稳定性由ES保证
- 优点:性能高,能支撑高并发访问和多条件检索
- 缺点:开发成本增加,需要维护第三方组件
- 映射法检索,通过非partition key找到对应的partition key,再根据partition key做hash找到对应库表
八、mysql分区是什么?
mysql表分区概念讲解,分区有哪些优势
- 分区表的概念
- 分区和分表相似,都是按照规则分解表。不同在于分表将大表分解为若干个独立的实体表,而分区是将数据分段划分在多个位置存放,可以是同一块磁盘也可以在不同的机器
- 分区后,表面上还是一张表,但数据散列到多个位置了,app读写的时候操作的还是大表名字,db自动去组织分区的数据
- 分区表有哪些类型
- range分区类型:range 根据属于指定范围的列值将行分配到分区 (range就是区间,guave.range) a 判断==>[1,100]
- list分区类型: 根据与离散值集之一匹配的列将行分配到分区
- hash 分区类型:基于由用户定义的表达式返回的值而选择的分区,对要插入表中的行的列值进行操作
九、mysql分区原理和优劣势分析
分区表实践
CREATE TABLE `product` ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '自增id', `sale_id` varchar(64) NOT NULL DEFAULT '' COMMENT '卖家ID', `store_id` bigint(20) NOT NULL COMMENT '店铺ID', `product_seq` varchar(64) NOT NULL COMMENT '商品标识', `sku_id` varchar(64) NOT NULL COMMENT '商品skuID', `spu_id` varchar(64) NOT NULL COMMENT '商品spuID', `valid` tinyint(1) DEFAULT '1' COMMENT '是否有效,0无效,1有效', `create_time` datetime DEFAULT '2020-01-01 00:00:00' COMMENT '创建时间', `update_time` datetime DEFAULT '2020-01-01 00:00:00' COMMENT '更新时间', PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=1001025 DEFAULT CHARSET=utf8mb4 partition by range columns(id,store_id) ( partition p01 values less than (10000), partition p02 values less than (20000), partition p03 values less than (100000000) );
- 分区表原理
- 存储角度分析:分区表是由多个相关的底层表实现,这些底层表也是由句柄对象表示,所以我们也可以直接访问各个分区,存储引擎管理分区的各个底层表和管理普通表一样
- 查询角度分析:分区表的索引只是在各个底层表上各自加上一个相同的索引,从存储引擎的角度来看,底层表和一个普通表没有任何不同,存储引擎也无须知道这是一个普通表还是一个分区表的一部分
- 分区表使用场景
- 表非常大以至于无法全部都放在内存中,或者只在表的最后部分有热点数据,其他都是历史数据
- 区表的数据更容易维护,如:想批量删除大量数据可以使用清除整个分区的方式
- 分区表的数据可以分布在不同的物理设备上,从而高效地利用多个硬件设备
- 优化查询,在where字句中包含分区列时,可以只使用必要的分区来提高查询效率,同时在涉及sum()和count()这类聚合函数的查询时,可以在每个分区上面并行处理,最终做汇总 10个分区分别分别count()
- 分区表的劣势
- 5.1一个表最多只能有1024个分区(mysql5.6之后支持8192个分区)。
- 如果分区字段中有主键或者唯一索引列,那么所有主键列和唯一索引列都必须包含进来,如果表中有主键或唯一索引,那么分区键必须是主键或唯一索引
- 如果SQL不走分区键,很容易出现全表锁
- 分库分表,自己掌控业务场景与访问模式,可控;分区表,工程师写了一个SQL,自己无法确定MySQL是怎么玩的,不可控
- 在分区表实施关联查询,就是一个灾难
本文作者为DBC,转载请注明。