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中的索引也解决不了海量数据查询慢的状况,那么有了水平分表与垂直分表的出现(我就是记录一下自己的理解) 水平分 ...
随机推荐
- 删除docker下的镜像
先显示一下docker中的镜像 删除镜像 先停止这个容器 删除容器 再删除镜像就可以啦!
- 力攻突破M20的5分钟BOLL
- js跨域需要token。
将rems从tms中独立出来以后,每次都需要先打开tms,再打开rems,如果我足够聪明,那么很容易可以分析得到原因. 第一,会导致跨域出现问题的易错点就那么几个,是否加上“Access-Contro ...
- VS2010和选中代码相同的代码的颜色设置,修改高亮颜色
使用Visual Studio 2010, 发现很难看清非活动的选中代码,研究了下,发现以下方法可以设置: 1. 菜单:工具 -> 选项 ->环境 ->字体和颜色 2. 在右边 ...
- tp 例子=登录逻辑
<?php namespace Home\Controller; use Think\Controller; class LoginController extends Controller{ ...
- CSS常用样式属性
1.CSS字体和文本相关属性 属性 font-family 规定文本的字体系列,比如:“serif” ''sans-serif" font-size 规定文本的字体尺寸 font-style ...
- html中通过js获取接口JSON格式数据解析以及跨域问题
前言:本人自学前端开发,一直想研究下js获取接口数据在html的实现,顺利地找到了获取数据的方法,但是有部分接口在调用中出现无法展示数据.经查,发现时跨域的问题,花费了一通时间,随笔记录下过程,以方便 ...
- Yii2 Restful api分页
- OS Tools-GO富集分析工具的使用与解读详细教程
我们的云平台上的GO富集分析工具,需要输入的文件表格和参数很简单,但很多同学都不明白其中的原理与结果解读,这个帖子就跟大家详细解释~ 一.GO富集介绍: Gene Ontology(简称G ...
- 设计模式之Singleton(单态)(转)
定义: Singleton模式主要作用是保证在Java应用程序中,一个类Class只有一个实例存在. 在很多操作中,比如建立目录 数据库连接都需要这样的单线程操作. 还有, singleton能够被状 ...