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数据表结构的各成员数据表必须具有完全一样的结构。每一个成员数据表的数据列必须按照同样的顺序定义同样的名字和类型,索引也必须按照同样的顺序和同样的方式定义。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值