由来
项目中使用到了mycat这个数据库中间件,由于之前没有接触过,在项目初期都是新建的mycat全局表,即type=“global”。在刚开始数据量不大的时候没发现什么问题,我们是saas系统,索引什么的也都做了优化。但是后来发现测试租户有一项业务的记录达到了1w左右的时候,分页查询大概需要2-3s。
环境搭建
下载后解压如图:
mycat几处关键配置:
1、server.xml配置:
2、schema.xml配置
3、rule.xml配置
4、启动mycat
数据准备
1、sql脚本,分别在db1,db2,db3,db4(本地数据库,对应schema.xml中定义的writeHost)执行
DROP TABLE IF EXISTS `customer`;
CREATE TABLE `customer` (
`id` varchar(64) NOT NULL COMMENT '主键id',
`name` varchar(64) NOT NULL COMMENT '名称',
`creator` varchar(64) DEFAULT NULL COMMENT '创建人',
`create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updator` varchar(64) DEFAULT NULL COMMENT '修改人',
`update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='customer';
DROP TABLE IF EXISTS `orders`;
CREATE TABLE `orders` (
`id` varchar(64) NOT NULL COMMENT '主键id',
`customer_id` varchar(64) NOT NULL COMMENT 'customer_id',
`creator` varchar(64) DEFAULT NULL COMMENT '创建人',
`create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updator` varchar(64) DEFAULT NULL COMMENT '修改人',
`update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='orders';
DROP TABLE IF EXISTS `order_items`;
CREATE TABLE `order_items` (
`id` varchar(64) NOT NULL COMMENT '主键id',
`order_id` varchar(64) NOT NULL COMMENT 'order_id',
`creator` varchar(64) DEFAULT NULL COMMENT '创建人',
`create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updator` varchar(64) DEFAULT NULL COMMENT '修改人',
`update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='order_items';
DROP TABLE IF EXISTS `company`;
CREATE TABLE `company` (
`id` varchar(64) NOT NULL COMMENT '主键id',
`name` varchar(64) NOT NULL COMMENT '名称',
`creator` varchar(64) DEFAULT NULL COMMENT '创建人',
`create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updator` varchar(64) DEFAULT NULL COMMENT '修改人',
`update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='company';
1、往父表customer表中批量插入200w+数据,查看数据分布是否分片
查看结果(初步符合预期):
select count(*) FROM db1.customer; -- 521662条
select count(*) FROM db2.customer; -- 485777条
select count(*) FROM db3.customer; -- 475144条
select count(*) FROM db4.customer; -- 517417条
2、往子表orders表中新增1w数据,查看分布是否同主表id同一个库
查看结果(符合预期):
select count(*) FROM db1.orders; -- 4000条
select count(*) FROM db2.orders; -- 4000条
select count(*) FROM db3.orders; -- 4000条
select count(*) FROM db4.orders; -- 4000条