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)
水平分表完成!
mysql 水平分表技术的更多相关文章
- MySQL常见水平分表技术方案
根据经验,Mysql表数据一般达到百万级别,查询效率会很低,容易造成表锁,甚至堆积很多连接,直接挂掉:水平分表能够很大程度较少这些压力. 1.按时间分表 这种分表方式有一定的局限性,当数据有较强的实效 ...
- (转)mysql水平分表和垂直分表和数据库分区
坚信数据库的物理设计在对高级数据库的性能影响上远比其他因素重要.给大家说一下经过专家对Oracle的研究,他们解释了为什么拙劣的物理设计是数据库停机(无论是有计划的还是没计划的)背后的主要原因.但在这 ...
- mysql水平分表和垂直分表的优缺点
表分割有两种方式: 1.水平分割:根据一列或多列数据的值把数据行放到两个独立的表中. 水平分割通常在下面的情况下使用. •表很大,分割后可以降低在查询时需要读的数据和索引的页数,同时也降低了索引的层数 ...
- mysql 水平分表
新建10张表,user_0,user_1,...user_9,方法不可串用,采用hash或取余法,获取要操作的表名,取值用对应存值的方法 1.hash取余法 public function part_ ...
- MySQL水平分表
业务表增长速度较快,单表数据较大,对表的读写有影响. 思路:化整为零,把单表拆解为多表,按指定的算法规则选择表. 好处:能大幅降低单表的数据,读写更快,同时分散了表数据, SQL语句也分散到不同的表中 ...
- mysql使用MRG_MyISAM(MERGE)实现水平分表
在MySQL中数据的优化尤其是大数据量的优化是一门很大的学问,当然其它数据库也是如此,即使你不是DBA,做为一名程序员掌握一些基本的优化信息,也可以让你在自己的程序开发中受益匪浅.当然数据库的优化有很 ...
- TDSQL MySQL版基本原理-水平分表 读写分离 弹性扩展 强同步
TDSQL MySQL版(TDSQL for MySQL)是部署在腾讯云上的一种支持自动水平拆分.Shared Nothing 架构的分布式数据库.TDSQL MySQL版 即业务获取的是完整的逻辑库 ...
- mysql中的优化, 简单的说了一下垂直分表, 水平分表(有几种模运算),读写分离.
一.mysql中的优化 where语句的优化 1.尽量避免在 where 子句中对字段进行表达式操作select id from uinfo_jifen where jifen/60 > 100 ...
- mysql数据库的水平分表与垂直分表实例讲解
mysql语句的优化有局限性,mysql语句的优化都是围绕着索引去优化的,那么如果mysql中的索引也解决不了海量数据查询慢的状况,那么有了水平分表与垂直分表的出现(我就是记录一下自己的理解) 水平分 ...
随机推荐
- cocos2d-x JS 富文本(为一段文本中的个别字体上颜色)
setWinText : function (levelStr1,levelStr2,levelStr3,color1,color2) { var imgRankingBG = this.contai ...
- unity3d-解密加密数据
利用RijndaelManaged加密解码.需要导入命名空间 using System.Security.Cryptography; 一个很简单的例子,最终的结果 解密和加密类 public clas ...
- sqli-labs(十)(过滤注释符)
第二十三关: 这关还是一个GET型.字符串.单引符号.的有报错的sql注入,输入?id=1' ,页面会报错 我们继续按照之前的套路来,先输入?id=1' or '1'='1 页面正常显示,说明这个地 ...
- Windows搭建react-native开发环境
一.目标平台 windows+android 1. 必须软件 python2+ nodejs npm 2. 安装react-native命令行 $ npm install -g react-nativ ...
- SQL Server物化视图学习笔记
一. 基本知识 摘抄自http://www.cnblogs.com/kissdodog/p/3385161.html SQL Server索引 - 索引(物化)视图 <第九篇> 索引视 ...
- DX9 空间坐标变换示例代码
// @time 2012.3.25 // @author jadeshu #include <Windows.h> #include <d3d9.h> #include &l ...
- <5>Cocos Creator 脚本简介
1.创建脚本 在资源管理器窗口中点击鼠标右键,显示菜单中点击新建,选择新建的脚本类型,这里举例就选择菜单中的JavaScript,或者如下图点击创建按钮也可. 新建后就会在资源管理器中出现一个NewS ...
- 4.构造Thread对象你也许不知道的几件事
1.Thread类对象只有在调用了start()方法之后,JVM虚拟机才会给我们创建一个真正的线程!否则就不能说是创建了线程!也就是说new Thread()之后,此时实际上在计算机底层,操作系统实际 ...
- 安装模块时报错“error: Microsoft Visual C++ 14.0 is required…”
安装pymssql时报错:在安装的过程中遇到了“error: Microsoft Visual C++ 14.0 is required…” 解决办法: 进入https://www.lfd.uci.e ...
- Java多线程-----创建线程的几种方式
1.继承Thread类创建线程 定义Thread类的子类,并重写该类的run()方法,该方法的方法体就是线程需要完成的任务,run()方法也称为线程执行体 创建Thread子类的实例,也就是创建 ...