您的位置:首页 > 数据库 > MySQL

mysql利用merge存储引擎分表的方法

2016-07-06 00:00 751 查看

1、创建分表,和主表的表结构相同,这里创建3个表

1
2
CREATE TABLE 新表 LIKE 旧表;
CREATE TABLE nqhuacom1 LIKE nqhuacom;

2、复制主表数据到分表

1
2
3
4
5
6
INSERT INTO nqhuacom1 SELECT * FROM nqhuacom LIMIT 50000;
INSERT INTO nqhuacom2 SELECT * FROM nqhuacom LIMIT 50001,50000;
INSERT INTO nqhuacom3 SELECT * FROM nqhuacom LIMIT 100002,50000;
INSERT INTO nqhuacom4 SELECT * FROM nqhuacom LIMIT 150003,50000;
INSERT INTO nqhuacom5 SELECT * FROM nqhuacom LIMIT 200004,50000;
INSERT INTO nqhuacom6 SELECT * FROM nqhuacom LIMIT 250005,50000;

3、创建汇总表nqhuacomall

1
2
CREATE TABLE nqhuacomAll LIKE nqhuacom;
ALTER TABLE csdnall  ENGINE=MERGE UNION=(nqhuacom1,nqhuacom2,nqhuacom3,nqhuacom4,nqhuacom5,nqhuacom6) INSERT_METHOD=LAST;
创建Mysql Merge表的参数 INSERT_METHOD有几个参数 。
LAST 如果你执行insert 指令来操作merge表时,插入操作会把数据添加到最后一个子表中。FIRST 同理,执行插入数据时会把数据添加到第一个子表中。

——————————————————————————————

不停机修改mysql表结构

同样还是members表,前期设计的表结构不尽合理,随着数据库不断运行,其冗余数据也是增长巨大,使用了下面的方法来处理:
先创建一个临时表:

1
2
/*创建临时表*/
CREATE TABLE members_tmp LIKE members
然后修改members_tmp的表结构为新结构,接着使用上面那个for循环来导出数据,因为1000万的数据一次性导出是不对的,mid是主键,一个区间一个区间的导,基本是一次导出5万条吧,这里略去了,接着重命名将新表替换上去:

1
2
/*这是个颇为经典的语句哈*/
RENAME TABLE members TO members_bak,members_tmp TO members;
就是这样,基本可以做到无损失,无需停机更新表结构,但实际上RENAME期间表是被锁死的,所以选择在线少的时候操作是一个技巧。经过这个操作,使得原先8G多的表,一下子变成了2G多
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: