mysql一个简单的横向分表创建教程
分表其实有很多种的方法可行 就像是集群我们也可以叫做是分表 今天给大家演示一个最简单的横向分表
1,创建一个完整表存储着所有的成员信息
create table member(
id bigint auto_increment primary key,
name varchar(20),
sex tinyint not null default '0'
)engine=myisam default charset=utf8 auto_increment=1;
添加数据
insert into member(id,name,sex) values (1,'jacson','0');
insert into member(name,sex) VALUES ('zxx',1); 反复执行这句
你会看到这个表里面有很多的数据
2,下面我们进行分表:这里我们分两个表tb_member1,tb_member2
DROP table IF EXISTS tb_member1;
create table tb_member1(
id bigint primary key auto_increment ,
name varchar(20),
sex tinyint not null default '0'
)ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
DROP table IF EXISTS tb_member2;
create table tb_member2(
id bigint primary key auto_increment ,
name varchar(20),
sex tinyint not null default '0'
)ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
记住了这表的引擎都是一样的!
3,创建主表tb_member
DROP table IF EXISTS tb_member;
create table tb_member(
id bigint primary key auto_increment ,
name varchar(20),
sex tinyint not null default '0'
)ENGINE=MERGEUNION=(tb_member1,tb_member2)INSERT_METHOD=LASTCHARSET=utf8 AUTO_INCREMENT=1 ;
4,接下来,我们把数据分到两个分表中去:
insert into tb_member1(id,name,sex) select id,name,sex from memberwhere id%2=0;
insert into tb_member2(id,name,sex) select id,name,sex from memberwhere id%2=1;
这里的是条件!
查看一下主表的数据:select * from tb_member; 你会发现柱表里面的数据是分表一 和分表二的结合
其实再tb_number里面没有存储数据 他就像一个外壳
存取数据发生在一个一个的分表里面
当在操作数据库的时候我们需要去判断数据在那个表里面 上面我们的数据是基数和偶数去存储的条件 所以当我们再读取数据的时候也可以根据用户的ID的奇偶性去判断表 当然你可以根据自己的分表去决定如何去选择表
注意:
1)ENGINE=MERGE
指明使用MERGE引擎,有些同学可能见到过ENGINE=MRG_MyISAM的例子,也是对的,它们是一回事。
2)UNION=(t1,t2)
指明了MERGE表中挂接了些哪表,可以通过altertable的方式修改UNION的值,以实现增删MERGE表子表的功能。
3)INSERT_METHOD=LAST
INSERT_METHOD指明插入方式,取值可以是:0不允许插入;FIRST插入到UNION中的第一个表;LAST插入到UNION中的最后一个表。
4)MERGE表及构成MERGE数据表结构的各成员数据表必须具有完全一样的结构。每一个成员数据表的数据列必须按照同样的顺序定义同样的名字和类型,索引也必须按照同样的顺序和同样的方式定义。
以下摘自https://www.cnblogs.com/luojianqun/p/4903743.html
1)建表时UNION指明的子表如果存在相同主键的记录会怎么样?
相同主键的记录会同时存在于MERGE中,就像第三节中的例子所示。但如果继续向MERGE表中插入数据,若数据主键已存在则无法插入。换言之,MERGE表只对建表之后的操作负责。
2)若MREGE后存在重复主键,按主键查询会是什么结果?
顺序查询,只出现一条查询记录即停止。比如第三节中的例子,如果执行
1 select * from t where id=1;
只会得到结果
+----+--------+
|id|log|
+----+--------+
|1|test1|
+----+--------+
3)直接删除一个子表会出现什么情况,正确删除的方式是怎样的?
MERGE表会被破坏,正确方式是用altertable方式先将子表从MERGE表中去除,再删除子表。
以第三节中的例子为例,执行如下操作
可以从MERGE表中去除t2,这里你可以安全的对t2进行任何操作了。
4)误删子表时,如何恢复MERGE表?
误删子表时,MERGE表上将无法进行任何操作。
方法1,dropMERGE表,重建。重建时注意在UNION部分去掉误删的子表。
方法2,建立MERGE表时,会在数据库目录下生成一个.MRG文件,比如设表名为t,则文件名为t.MRG。
文件内容类似:
t1
t2
#INSERT_METHOD=LAST
指明了MGEGE表的子表构成及插入方式。
可以直接修改此文件,去掉误删表的表名。然后执行flushtables即可修复MERGE表。
5)MERGE的子表中之前有记录,且有自增主键,则MERGE表创建后,向其插入记录时主键以什么规则自增?
以各表中的AUTO_INCREMENT最大值做为下一次插入记录的主键值。
比如t1的自增ID至6,t2至4,则创建MERGE表后,插入的下一条记录ID将会是7
6)两个结构完全相同的但已存在数据的表,是否一定可以合成一个MEREGE表?
从实验的结果看,不是这样的,有时创建出的表,无法进行任何操作。
所以,推荐的使用方法是先有一个MERGE表,里面只包含一张表,当一个这个表的的大小增长到一定程度(比如200w)时,创建另一张空表,将其挂入MERGE表,然后继续插入记录。
7)删除MERGE表是否会对子表产生影响?
不会
8)MREGE表的子表的ENGIN是否有要求?
有的,必须是MyISAM表 -----