MySQL Merge引擎实现分表

时间:2022-09-18 19:51:31

一、Merge引擎是一组MyISAM表的组合,组合的分表结构必须完全相同,Merge表本身没有数据,对Merge表的操作实际上都是对子表的操作,只是对上层访问来说是透明的,在插入的时候默认是插入到最后一张子表上,也可以指定插入到第一张子表上。

二、示例

  使用数据表AuthTrace为例子,表结构为

CREATE TABLE `AuthTrace` (
  `Id` int(11) NOT NULL AUTO_INCREMENT,
  `AuthId` char(255) DEFAULT NULL,
  `Addtime` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '添加记录的当前时间',
  `UserIp` varchar(255) DEFAULT NULL COMMENT '用户Ip',
  `Date` date DEFAULT NULL COMMENT 'yyyyMMdd格式',
  `ExtraInfo` varchar(255) DEFAULT NULL COMMENT '额外信息',
  `UserMAC` varchar(255) DEFAULT NULL COMMENT 'mac地址',
  PRIMARY KEY (`Id`)
) ENGINE=InnoDB AUTO_INCREMENT=770 DEFAULT CHARSET=utf8;

  基本操作是:新建2张表AuthTrace1、AuthTrace2,将AuthTrace表的数据插入这两张表,然后新建一张merge表,然后CURD都可以针对这张merge表了。

,注意这两张表的引擎为MyISAM,而merge表的引擎是MERGE

  创建AuthTrace1、AuthTrace2表

CREATE TABLE `AuthTrace1` (
  `Id` int(11) NOT NULL AUTO_INCREMENT,
  `AuthId` char(255) DEFAULT NULL,
  `Addtime` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '添加记录的当前时间',
  `UserIp` varchar(255) DEFAULT NULL COMMENT '用户Ip',
  `Date` date DEFAULT NULL COMMENT 'yyyyMMdd格式',
  `ExtraInfo` varchar(255) DEFAULT NULL COMMENT '额外信息',
  `UserMAC` varchar(255) DEFAULT NULL COMMENT 'mac地址',
  PRIMARY KEY (`Id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE `AuthTrace2` (
  `Id` int(11) NOT NULL AUTO_INCREMENT,
  `AuthId` char(255) DEFAULT NULL,
  `Addtime` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '添加记录的当前时间',
  `UserIp` varchar(255) DEFAULT NULL COMMENT '用户Ip',
  `Date` date DEFAULT NULL COMMENT 'yyyyMMdd格式',
  `ExtraInfo` varchar(255) DEFAULT NULL COMMENT '额外信息',
  `UserMAC` varchar(255) DEFAULT NULL COMMENT 'mac地址',
  PRIMARY KEY (`Id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

插入数据

insert into AuthTrace1 select * from AuthTrace where id%2=0
insert into AuthTrace2 select * from AuthTrace where id%2=1

 结果:

AuthTrace1中的id为偶数,AuthTrace2中的数据为奇数

创建AuthTrace_Merge表,表结构需要跟AuthTrace1、AuthTrace2数据结构一致,

CREATE TABLE `AuthTrace_Merge` (
  `Id` int(11) NOT NULL AUTO_INCREMENT,
  `AuthId` char(255) DEFAULT NULL,
  `Addtime` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '添加记录的当前时间',
  `UserIp` varchar(255) DEFAULT NULL COMMENT '用户Ip',
  `Date` date DEFAULT NULL COMMENT 'yyyyMMdd格式',
  `ExtraInfo` varchar(255) DEFAULT NULL COMMENT '额外信息',
  `UserMAC` varchar(255) DEFAULT NULL COMMENT 'mac地址',
  PRIMARY KEY (`Id`)
)ENGINE=MERGE DEFAULT CHARSET=utf8 INSERT_METHOD=LAST AUTO_INCREMENT=1 UNION=(`AuthTrace1`,`AuthTrace2`);

MySQL Merge引擎实现分表

INSERT_METHOD:表示插入方式;

INSERT_METHOD=LAST 添加数据的时候插入到最后一个表,这里就是t2

INSERT_METHOD=FIRST 添加数据的时候插入到第一个表,这里就是t1

INSERT_METHOD=0 不允许插入

UNION = (`AuthTrace1`,`AuthTrace2`) 关联AuthTrace1和AuthTrace2表 

Merge表 数据结构必须和分表完全一致

 

三、缺点

Authtrace1表中的id是偶数,Authtraace2表中id是奇数。假如INSERT_METHOD=LAST,也就是新的数据会插入到最后一张表,即Authtrace2表。

执行sql:

INSERT INTO `AuthTrace_Merge` VALUES ('2', '12222', '2019-05-21 10:06:50', '172.14.4.4', '2019-05-21', null, null);

那么Authtrace2表中会有这条id=2的数据。由于Authtrace1表中已经有了一个id=2的数据。所以执行sql

MySQL Merge引擎实现分表

检索出来了,id=2的数据有两条,位于不同的字表,id明明是自增列,现在确重复了,关键是因为有2个字表,而插数据的时候不会每个字表检查id是否重复的,所以这是个缺点。