本次主要采用MERGE分表法、对表进行水平拆分;
第一步:创建数据库
DROP TABLE IF EXISTS students
;
CREATE TABLE students
(
id
bigint(20) NOT NULL AUTO_INCREMENT,
name
varchar(20) DEFAULT NULL,
num
varchar(20) DEFAULT NULL,
PRIMARY KEY (id
)
) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
第二步:添加数据
insert into students(name,num) values(‘steven’,‘0001’);
第三步:执行数据,蠕虫插入法
重复几次增加数据就到百万级
insert into students(name,num) select name,num from students
第四步:建立子表
根据自己的业务需求创建表的数量,举例:
DROP TABLE IF EXISTS students_01
;
CREATE TABLE students_01
(
id
bigint(20) NOT NULL AUTO_INCREMENT,
name
varchar(20) DEFAULT NULL,
num
varchar(20) DEFAULT NULL,
PRIMARY KEY (id
)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
DROP TABLE IF EXISTS students_02
;
CREATE TABLE students_02
(
id
bigint(20) NOT NULL AUTO_INCREMENT,
name
varchar(20) DEFAULT NULL,
num
varchar(20) DEFAULT NULL,
PRIMARY KEY (id
)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
第五步:创建虚拟主表
作为students_01、students_02表的关系表,数据存储在students_01、students_02上
DROP table IF EXISTS tb_students;
create table tb_students(
idbigint(20) NOT NULL AUTO_INCREMENT,
namevarchar(20) DEFAULT NULL,
numvarchar(20) DEFAULT NULL, PRIMARY KEY (
id`)
)ENGINE=MERGE UNION=(students_01,students_02) INSERT_METHOD=LAST CHARSET=utf8 AUTO_INCREMENT=1;
注:可能出现问题:
1、检查字段是否相同
2、检查子表类型是否为ENGINE=MyISAM
第六步:把主表的数据分拆到子表中
insert into students_01(name,num) select name,num from students where id%2=0;
insert into students_02(name,num) select name,num from students where id%2<>0;
最后完成以上步骤之后,分表完成;
增加数据:insert into tb_students(name,num) values(‘steven’,‘0001’);
查询数据:select * from tb_students
分表之后可以根据当前业务找到指定分区进行查询,可以快速定位找到数据,防止数据过多导致查询变慢、提高查询效率。
参考地址:
https://www.cnblogs.com/lucky-man/p/6207873.html
以上是实践所得,不足之处还请留言指出,相互学习,共同进步~