一、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`);
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
检索出来了,id=2的数据有两条,位于不同的字表,id明明是自增列,现在确重复了,关键是因为有2个字表,而插数据的时候不会每个字表检查id是否重复的,所以这是个缺点。