MySQL Merge引擎實現分表


一、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是否重復的,所以這是個缺點。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM