Merge表有點相似於視圖。使用Merge存儲引擎實現MySQL分表,這種方法比較適合那些沒有事先考慮分表,隨着數據的增多,已經出現了數據查詢慢的狀況。大數據
這個時候若是要把已有的大數據量表分開比較痛苦,最痛苦的事就是改代碼。因此使用Merge存儲引擎實現MySQL分表能夠避免改代碼。spa
Merge引擎下每一張表只有一個MRG文件。MRG裏面存放着分表的關係,以及插入數據的方式。它就像是一個外殼,或者是鏈接池,數據存放在分表裏面。code
merge合併表的要求:blog
對於增刪改查,直接操做總表便可。索引
1.用戶1表it
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表table
create table user2 like user1;
3.主表class
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。test
2) INSERT_METHOD,表示插入方式,取值能夠是:0 和 1,0表明不容許插入,1表明能夠插入;date
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沒有重複的:
搞定。