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

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

原文:https://www.cnblogs.com/xbq8080/p/6628034.html

一、使用場景

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

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

  Merge引擎下每一張表只有一個MRG檔案。MRG裡面存放著分表的關係,以及插入資料的方式。它就像是一個外殼,或者是連線池,資料存放在分表裡面。

  merge合併表的要求:

  • 合併的表使用的必須是MyISAM引擎
  • 表的結構必須一致,包括索引、欄位型別、引擎和字符集

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

二、建表

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表中分別建立一個觸發器(tr_seq和tr_seq2),觸發器的功能是 當在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沒有重複的:

  

搞定。