博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
MySQL分库分表
阅读量:4630 次
发布时间:2019-06-09

本文共 7131 字,大约阅读时间需要 23 分钟。

https://blog.csdn.net/csdn_heshangzhou/article/details/82963237

https://mp.weixin.qq.com/s/BDXrSFG5KwIi9OjOZcOaYw

 

一、水平分表

这里做的是我的一个笔记。

水平分表比较简单, 理解就是:

  • 合并的表使用的必须是MyISAM引擎
  • 表的结构必须一致,包括索引、字段类型、引擎和字符集

数据表

user1

1
2
3
4
5
6
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

1
create table user2 like user1;

user

1
2
3
4
5
6
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中的最后一个表。

触发器

1
2
3
create table tb_ids(
id 
int);
 
insert into tb_ids values(1);

如果user1和user2中有数据的话先清除

1
2
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

1
2
3
4
5
6
7
8
9
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

1
2
3
4
5
6
7
8
9
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执行的, 效果都一样.

然后查询一下触发器

1
select 
* from information_schema.triggers where TRIGGER_NAME=
'tr_seq' 
\G;

此时已经分表成功, 下面插入数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
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)

查询一下所有数据库

1
show tables;

查询user1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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)

 再插入几条数据, 前面插入的太偏向了

1
2
3
4
5
6
7
8
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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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一下

1
2
3
mysql> update user 
set 
name=
'刘备' 
where 
id 
=
'9'
;
Query OK, 1 row affected (0.01 sec)
Rows matched: 1  Changed: 1  Warnings: 0

 再看一下user

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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)

 

水平分表完成!

转载于:https://www.cnblogs.com/zgzf/p/10311676.html

你可能感兴趣的文章
正则表达式string对象方法
查看>>
解析json实例
查看>>
spring中实现自己的初始化逻辑
查看>>
Accommodation development for Kaikoura
查看>>
Oracle11.2新特性之listagg函数 (行列转换)
查看>>
Flutter学习之动态ListView
查看>>
myeclipse中安装svn插件
查看>>
微信小程序----调用用户信息
查看>>
Ubuntu系统---安NVIDIA 驱动后 CUDA+cuDNN 安装
查看>>
Spring Boot配置全局异常捕获
查看>>
Java 的zip压缩和解压缩
查看>>
SPOJ375(树链剖分)
查看>>
C基础知识小总结(十)
查看>>
Ignatius and the Princess IV (水题)
查看>>
ConcurrentHashMap实现原理及源码分析
查看>>
AES加解密
查看>>
洛谷 P5019 铺设道路(差分)
查看>>
CSS层叠样式
查看>>
Pycharm初始创建项目和环境搭建(解决aconda库文件引入不全等问题)
查看>>
Spring Boot启动过程(二)
查看>>