1. 程式人生 > >使用Merge存儲引擎實現MySQL分表

使用Merge存儲引擎實現MySQL分表

tro strong 數據 bar rst 都是 視圖 分享 gin

一、使用場景

  Merge表有點類似於視圖。使用Merge存儲引擎實現MySQL分表,這種方法比較適合那些沒有事先考慮分表,隨著數據的增多,已經出現了數據查詢慢的情況。

這個時候如果要把已有的大數據量表分開比較痛苦,最痛苦的事就是改代碼。所以使用Merge存儲引擎實現MySQL分表可以避免改代碼。

  Merge引擎下每一張表只有一個MRG文件。MRG裏面存放著分表的關系,以及插入數據的方式。它就像是一個外殼,或者是連接池,數據存放在分表裏面。

對於增刪改查,直接操作總表即可。

二、建表

  1.用戶1表

技術分享圖片
CREATE TABLE `user1` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(50) DEFAULT NULL,
  `sex` int(1) NOT NULL DEFAULT ‘0‘,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8; 
技術分享圖片

  2.用戶2表

  create table user2 like user1;

  3.主表

技術分享圖片
CREATE TABLE `alluser` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(50) DEFAULT NULL,
  `sex` int(1) NOT NULL DEFAULT ‘0‘,
  KEY `id` (`id`)
) ENGINE=MRG_MyISAM DEFAULT CHARSET=utf8 INSERT_METHOD=LAST UNION=(`user1`,`user2`);
技術分享圖片

  1) ENGINE = MERGE 和 ENGINE = MRG_MyISAM是一樣的意思,都是代表使用的存儲引擎是 Merge。

  2) INSERT_METHOD,表示插入方式,取值可以是:0 和 1,0代表不允許插入,1代表可以插入;

  3) FIRST插入到UNION中的第一個表,LAST插入到UNION中的最後一個表。

三、操作

  1. 先在user1表中增加一條數據,然後再在user2表中增加一條數據,查看 alluser中的數據。

   insert into user1(name,sex) values (‘張三‘,1);

   insert into user2(name,sex) values (‘李四‘,2);

   select * from alluser; 發現是剛剛插入的數據如下:

   技術分享圖片

   這就出現了一個id重復,這就造成了當刪除和修改的時候異常,解決辦法是給 alluser的id賦唯一值。

   我們解決方法是,重新建立一張表tb_ids(id int),用來專門存一個id的,並插入一條初始數據,同時刪除掉user1和user2中的數據。

  create table tb_ids(id int);
  insert into tb_ids values(1);
  delete from user1;
  delete from user2;

   然後在user1和user2表中建立一個觸發器,觸發器的功能是 當在user1或者user2表中增加一條記錄時,取出tb_ids中的id值,賦給user1和user2的id,然後將tb_ids的id值加1,

   觸發器內容如下(將user1改為user2):   

技術分享圖片
   DELIMITER $$
   CREATE TRIGGER tr_seq
   BEFORE INSERT on user1
   FOR EACH ROW BEGIN 
      select id  into @testid from tb_ids limit 1;
      update tb_ids set id = @testid + 1;
   set new.id =  @testid;
   END$$
   DELIMITER;
技術分享圖片

  2.在user1和user2表中分別增加一條數據,

   insert into user1(name,sex) values(‘王五‘,1);

   insert into user2(name,sex) values(‘趙六‘,2);

  3.查詢user1和user2中的數據:

   技術分享圖片 技術分享圖片

  4.查詢總表alluser中的數據,發現id沒有重復的:

   技術分享圖片

搞定。

使用Merge存儲引擎實現MySQL分表