MySql横向分表

MySql横向分表

现阶段主流互联网公司的业务量都很大,很容易就导致业务表变得臃肿,查询效率变低,再怎么优化sql;加索引最终还是不能解决问题,但是这些数据又必须要保存。这个时候就要考虑分表或者分库了。

这里主要讨论如何去分表,分库之后再讨论
1.根据表主键值范围分:比如1~2000放到tb_1;2001~4000放到tb_2
2.根据数值取模:余数为0放tb_1;余数为1放tb_2。这样做有一个好处比如按用户id来分,同一个用户的数据就会落在一个表上,查询的时候可以指定这张表查询不需要遍历。

建表

DROP table IF EXISTS tb_user_1;
CREATE TABLE tb_user_1 (
id bigint NOT NULL AUTO_INCREMENT,
name varchar(50) CHARACTER SET utf8mb4 NOT NULL,
loginName varchar(45) DEFAULT NULL,
password varchar(64) CHARACTER SET latin1 NOT NULL,
createDt datetime DEFAULT NULL,
email varchar(45) CHARACTER SET latin1 DEFAULT NULL,
PRIMARY KEY (id) USING BTREE
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;

DROP table IF EXISTS tb_user_2;
CREATE TABLE tb_user_2 (
id bigint NOT NULL AUTO_INCREMENT,
name varchar(50) CHARACTER SET utf8mb4 NOT NULL,
loginName varchar(45) DEFAULT NULL,
password varchar(64) CHARACTER SET latin1 NOT NULL,
createDt datetime DEFAULT NULL,
email varchar(45) CHARACTER SET latin1 DEFAULT NULL,
PRIMARY KEY (id) USING BTREE
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;

创建主表

CREATE TABLE tb_user (
id bigint NOT NULL AUTO_INCREMENT,
name varchar(50) CHARACTER SET utf8mb4 NOT NULL,
loginName varchar(45) DEFAULT NULL,
password varchar(64) CHARACTER SET latin1 NOT NULL,
createDt datetime DEFAULT NULL,
email varchar(45) CHARACTER SET latin1 DEFAULT NULL,
PRIMARY KEY (id) USING BTREE
) ENGINE=MERGE UNION=(tb_user_1,tb_user_2) INSERT_METHOD=LAST CHARSET=utf8 AUTO_INCREMENT=1;

插入数据

insert into tb_user_1(id,name,loginName,password,createDt,email) select id,name,loginName,password,createDt,email from user where id%2=0;

insert into tb_user_2(id,name,loginName,password,createDt,email) select id,name,loginName,password,createDt,email from user where id%2=1;

user表是业务数据表

tb_user表没有主动插入数据,实际上去查询是有数据的,是分表tb_user_1和tb_user_2的数据集合。这是MERGE引擎的作用。

注意:

1)ENGINE=MERGE
MERGE存储引擎把一组MyISAM数据表当做一个逻辑单元来对待,让我们可以同时对他们进行查询,注意删除MERGE表的数据等于是删除了分表的数据。
2)UNION=(t1, t2)
指明了MERGE表中挂接了些哪表,可以通过alter table的方式修改UNION的值,以实现增删MERGE表子表的功能。
3)INSERT_METHOD=LAST
INSERT_METHOD指明插入方式,取值可以是:0 不允许插入;FIRST 插入到UNION中的第一个表; LAST 插入到UNION中的最后一个表。
4)MERGE表及构成MERGE数据表结构的各成员数据表必须具有完全一样的结构。每一个成员数据表的数据列必须按照同样的顺序定义同样的名字和类型,索引也必须按照同样的顺序和同样的方式定义。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章