阿里巴巴《Java 开发手册》提到Mysql单表行数超过 500 万行或者单表容量超过 2GB,推荐进行分库分表,那么如何进行分表呢?
1、MERGE分表法
1、MERGE分表思路
Merge分表法需要使用MyISAM存储引擎,mysql5.5以后默认使用Innodb 引擎。如果是对已有的数据表进行分表,需要注意修改旧表的存储引擎。
Merge分表思路是:当一个表的容量比较大需要分表时,首先创建分表,然后使用INSERT_METHOD=LAST创建Merge表,这样新的插入数据实际上会插入到新表中,数据增删查改都可以通过Merge表操作。但是也需要修改代码。
2、分表实现
DROP table IF EXISTS t1;
CREATE TABLE `t1` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`log` varchar(45) ,
PRIMARY KEY (`id`)
) ENGINE=MyISAM CHARSET=utf8 ;
DROP table IF EXISTS t2;
CREATE TABLE `t2`(
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`log` varchar(45) ,
PRIMARY KEY (`id`)
) ENGINE=MyISAM CHARSET=utf8;
或者 create table t2 LIKE t1;
CREATE TABLE mergetest.`t` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`log` varchar(45) ,
PRIMARY KEY (`id`)
) ENGINE=MERGE UNION=(mergetest.t1, mergetest.t2) INSERT_METHOD=LAST CHARSET=utf8 ;
这样新插入的数据直接进入到t2表中。
取值 | 意义 |
---|---|
0 | 不允许插入 |
FIRST | 新数据插入到 UNION 中的第一个表 |
LAST | 新数据插入到 UNION 中的最后一个表 |
如果是再新增分表,需要修改Merge表。
create table t3 LIKE t1;
alter table t ENGINE=MERGE UNION=(t1,t2,t3) INSERT_METHOD=FIRST;
创建主表时会遇到这样的错误:
ERROR 1168 (HY000): Unable to open underlying table which is differently defined
or of non-MyISAM type or doesn’t exist
排查方向:
1、查看是不是有一些子表不是MYISAM引擎的表,因为MERGE引擎只适用于MYISAM表
2、查看是不是在union的表中含有不存在的表。
3、查看是不是MERGE的时候引用了不在同一个库的表,并且该表没有指定数据库名字。
4、比较各个表的结构(索引、引擎、列、字符集等)是否一致。
2.基于中间件的分表
使用sharding-sphere分表,可以借用多种分片策略进行分片,通过配置比较方便的实现分表。