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中的索引也解决不了海量数据查询慢的状况,那么有了水平分表与垂直分表的出现(我就是记录一下自己的理解) 水平分 ...
随机推荐
- Kotlin sealed class
密封类的概念对于我这种从古代语言进化到现代语言的老古董来说还是有点绕腾的啊! 1. 密封类用来表示受限的类继承结构 解释:类中 元素值限制在某一个集合之中 2. 密封类可以有子类,但是所有的子类都必须 ...
- sqli-labs(十八)
第五十五关:和上一关类似,只是拼凑的方法不一样,所以需要先判断后台是怎么拼凑的 分别输入id=1'--+ id=1"--+ id=') --+ ...
- UGUI 打图集
using UnityEngine; using System.Collections; using UnityEditor; using System.Collections.Generic; us ...
- python number
一.number类型转换 int(x [,base ]) 将x转换为一个整数 long(x [,base ]) 将x转换为一个长整数 float(x ) 将x转换到一个浮点数 complex(real ...
- LeetCode12.整数转罗马数字
给定一个整数,将其转为罗马数字.输入确保在 1 到 3999 的范围内. 示例 1: 输入: 3 输出: "III" 示例 2: 输入: 4 输出: "IV" ...
- 十 js中forEach,for in,for of循环的用法
一.一般的遍历数组的方法: var array = [1,2,3,4,5,6,7]; for (var i = 0; i < array.length; i++) { console.log(i ...
- python pandas模块,nba数据处理(1)
pandas提供了使我们能够快速便捷地处理结构化数据的大量数据结构和函数.pandas兼具Numpy高性能的数组计算功能以及电子表格和关系型数据(如SQL)灵活的数据处理能力.它提供了复杂精细的索引功 ...
- 2-1:math库与random库
一.math库: math库是python语言中常用的一个函数库,它包含了一批数学函数,下面我们看一下这个函数库 由于math库中的函数与数学中的函数比较一致,相对比较简单,请同学们自行练习一下: 二 ...
- Day9 面向对象高级
一.方法 方法包括:普通方法.静态方法和类方法,三种方法在内存中都归属于类,区别在于调用方式不同. 普通方法:由对象调用:至少一个self参数:执行普通方法时,自动将调用该方法的对象赋值给self: ...
- Necklace (全排列 + 匈牙利)
#include<bits/stdc++.h> using namespace std; ][], Gra[][]; ]; ]; ]; bool dfs(int u, int vN) { ...