mysql 水平分表技術


 

 

 

 

 

這里做的是我的一個筆記。

水平分表比較簡單, 理解就是:

  • 合並的表使用的必須是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)

 

水平分表完成!

 


免責聲明!

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



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