這里做的是我的一個筆記。
水平分表比較簡單, 理解就是:
- 合並的表使用的必須是MyISAM引擎
- 表的結構必須一致,包括索引、字段類型、引擎和字符集
數據表
user1
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;
user2
create table user2 like user1;
user
CREATE TABLE `user` ( `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中的最后一個表。
觸發器
create table tb_ids(id int); insert into tb_ids values(1);
如果user1和user2中有數據的話先清除
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的觸發器:tr_seq
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;
user2的觸發器:tr_seq2
DELIMITER $$ CREATE TRIGGER tr_seq2 BEFORE INSERT on user2 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;
我是直接扔進一個sql文件source執行的, 效果都一樣.
然后查詢一下觸發器
select * from information_schema.triggers where TRIGGER_NAME='tr_seq' \G;
此時已經分表成功, 下面插入數據
mysql> insert into user1(name,sex) values('王五',1); Query OK, 1 row affected (0.02 sec) mysql> insert into user2(name,sex) values('張飛',2); Query OK, 1 row affected (0.01 sec) mysql> insert into user2(name,sex) values('張飛',2); Query OK, 1 row affected (0.01 sec) mysql> insert into user2(name,sex) values('張飛',2); Query OK, 1 row affected (0.01 sec) mysql> insert into user2(name,sex) values('張飛',2); Query OK, 1 row affected (0.01 sec) mysql> insert into user2(name,sex) values('張飛',2); Query OK, 1 row affected (0.01 sec) mysql> insert into user2(name,sex) values('張飛',2); Query OK, 1 row affected (0.00 sec) mysql> insert into user2(name,sex) values('張飛',2); Query OK, 1 row affected (0.01 sec) mysql> insert into user2(name,sex) values('張飛',2); Query OK, 1 row affected (0.01 sec) mysql> insert into user2(name,sex) values('張飛',2); Query OK, 1 row affected (0.00 sec) mysql> insert into user1(name,sex) values('王五',1); Query OK, 1 row affected (0.01 sec) mysql> insert into user1(name,sex) values('王五',1); Query OK, 1 row affected (0.01 sec) mysql> insert into user1(name,sex) values('王五',1); Query OK, 1 row affected (0.10 sec) mysql> insert into user1(name,sex) values('王五',1); Query OK, 1 row affected (0.01 sec) mysql> insert into user1(name,sex) values('王五',1); Query OK, 1 row affected (0.01 sec) mysql> insert into user1(name,sex) values('王五',1); Query OK, 1 row affected (0.01 sec) mysql> insert into user1(name,sex) values('王五',1); Query OK, 1 row affected (0.01 sec)
查詢一下所有數據庫
show tables;
查詢user1
mysql> select * from user1; +----+--------+-----+ | id | name | sex | +----+--------+-----+ | 1 | 王五 | 1 | | 11 | 王五 | 1 | | 12 | 王五 | 1 | | 13 | 王五 | 1 | | 14 | 王五 | 1 | | 15 | 王五 | 1 | | 16 | 王五 | 1 | | 17 | 王五 | 1 | +----+--------+-----+ 8 rows in set (0.00 sec)
查詢user2
mysql> select * from user2; +----+--------+-----+ | id | name | sex | +----+--------+-----+ | 2 | 張飛 | 2 | | 3 | 張飛 | 2 | | 4 | 張飛 | 2 | | 5 | 張飛 | 2 | | 6 | 張飛 | 2 | | 7 | 張飛 | 2 | | 8 | 張飛 | 2 | | 9 | 張飛 | 2 | | 10 | 張飛 | 2 | +----+--------+-----+ 9 rows in set (0.00 sec)
再插入幾條數據, 前面插入的太偏向了
mysql> insert into user1(name,sex) values('王五',1); Query OK, 1 row affected (0.01 sec) mysql> insert into user2(name,sex) values('王五',1); Query OK, 1 row affected (0.01 sec) mysql> insert into user2(name,sex) values('王五',4); Query OK, 1 row affected (0.04 sec) mysql> insert into user1(name,sex) values('王五',4); Query OK, 1 row affected (0.01 sec)
此時查看user
mysql> select * from user order by id asc; +----+--------+-----+ | id | name | sex | +----+--------+-----+ | 1 | 王五 | 1 | | 2 | 張飛 | 2 | | 3 | 張飛 | 2 | | 4 | 張飛 | 2 | | 5 | 張飛 | 2 | | 6 | 張飛 | 2 | | 7 | 張飛 | 2 | | 8 | 張飛 | 2 | | 9 | 張飛 | 2 | | 10 | 張飛 | 2 | | 11 | 王五 | 1 | | 12 | 王五 | 1 | | 13 | 王五 | 1 | | 14 | 王五 | 1 | | 15 | 王五 | 1 | | 16 | 王五 | 1 | | 17 | 王五 | 1 | | 18 | 王五 | 1 | | 19 | 王五 | 1 | | 20 | 王五 | 4 | | 21 | 王五 | 4 | +----+--------+-----+ 21 rows in set (0.00 sec)
user1
mysql> select * from user1 order by id asc; +----+--------+-----+ | id | name | sex | +----+--------+-----+ | 1 | 王五 | 1 | | 11 | 王五 | 1 | | 12 | 王五 | 1 | | 13 | 王五 | 1 | | 14 | 王五 | 1 | | 15 | 王五 | 1 | | 16 | 王五 | 1 | | 17 | 王五 | 1 | | 18 | 王五 | 1 | | 21 | 王五 | 4 | +----+--------+-----+ 10 rows in set (0.00 sec)
user2
mysql> select * from user2 order by id asc; +----+--------+-----+ | id | name | sex | +----+--------+-----+ | 2 | 張飛 | 2 | | 3 | 張飛 | 2 | | 4 | 張飛 | 2 | | 5 | 張飛 | 2 | | 6 | 張飛 | 2 | | 7 | 張飛 | 2 | | 8 | 張飛 | 2 | | 9 | 張飛 | 2 | | 10 | 張飛 | 2 | | 19 | 王五 | 1 | | 20 | 王五 | 4 | +----+--------+-----+ 11 rows in set (0.00 sec)
下面我們update一下
mysql> update user set name='劉備' where id ='9'; Query OK, 1 row affected (0.01 sec) Rows matched: 1 Changed: 1 Warnings: 0
再看一下user
mysql> select * from user order by id asc; +----+--------+-----+ | id | name | sex | +----+--------+-----+ | 1 | 王五 | 1 | | 2 | 張飛 | 2 | | 3 | 張飛 | 2 | | 4 | 張飛 | 2 | | 5 | 張飛 | 2 | | 6 | 張飛 | 2 | | 7 | 張飛 | 2 | | 8 | 張飛 | 2 | | 9 | 劉備 | 2 | | 10 | 張飛 | 2 | | 11 | 王五 | 1 | | 12 | 王五 | 1 | | 13 | 王五 | 1 | | 14 | 王五 | 1 | | 15 | 王五 | 1 | | 16 | 王五 | 1 | | 17 | 王五 | 1 | | 18 | 王五 | 1 | | 19 | 王五 | 1 | | 20 | 王五 | 4 | | 21 | 王五 | 4 | +----+--------+-----+ 21 rows in set (0.00 sec)
user1
mysql> select * from user1; +----+--------+-----+ | id | name | sex | +----+--------+-----+ | 1 | 王五 | 1 | | 11 | 王五 | 1 | | 12 | 王五 | 1 | | 13 | 王五 | 1 | | 14 | 王五 | 1 | | 15 | 王五 | 1 | | 16 | 王五 | 1 | | 17 | 王五 | 1 | | 18 | 王五 | 1 | | 21 | 王五 | 4 | +----+--------+-----+ 10 rows in set (0.00 sec)
user2
mysql> select * from user2; +----+--------+-----+ | id | name | sex | +----+--------+-----+ | 2 | 張飛 | 2 | | 3 | 張飛 | 2 | | 4 | 張飛 | 2 | | 5 | 張飛 | 2 | | 6 | 張飛 | 2 | | 7 | 張飛 | 2 | | 8 | 張飛 | 2 | | 9 | 劉備 | 2 | | 10 | 張飛 | 2 | | 19 | 王五 | 1 | | 20 | 王五 | 4 | +----+--------+-----+ 11 rows in set (0.00 sec)
水平分表完成!