mysql使用MRG_MyISAM(MERGE)实现水平分表
现在因为业务需要,有一张1100多万的数据需要分表。
考虑用MRG_MyISAM实现水平分表,定制一套规则确定需要分割多少张表。
实现如下:
1.创建3张子表,ENGINE指定为MyISAM(子表)。
CREATE TABLE `customer1` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(50) DEFAULT NULL,
`sex` int(1) NOT NULL DEFAULT '0',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
create table customer2 like customer1;
create table customer3 like customer1;
2.创建主表,ENGINE指定为MRG_MyISAM( INSERT_METHOD设置为NO 只读)
CREATE TABLE `customer` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(50) DEFAULT NULL,
`sex` int(1) NOT NULL DEFAULT '0',
KEY `id` (`id`)
) ENGINE=MRG_MyISAM DEFAULT
CHARSET=utf8 INSERT_METHOD=NO UNION=(`customer1`,`customer2`,`customer3`);
INSERT_METHOD属性说明:
- 0 /no不允许插入(最好用NO)
- FIRST 插入到UNION中的第一个表
- LAST 插入到UNION中的最后一个表
3.插入数据
INSERT INTO customer1(`id`, `name`, `sex`) VALUES ('2', '33', '0');
INSERT INTO customer2(`id`, `name`, `sex`) VALUES ('111', '111', '0');
INSERT INTO customer3(`id`, `name`, `sex`) VALUES ('222', '222', '0');
4.测试插入主表
INSERT INTO customer(`id`, `name`, `sex`) VALUES ('6666', '6666', '0');
如图插入失败,测试设置成功
SELECT * FROM customer
查询数据,测试成功
5.注意事项,子表之间的主键可以相同,根据业务可以生成ID来保证数据主键的不重复,或者业务不复杂的情况下,可以建立只有一个属性的表,自增来生成唯一主键。至于插入表的话可以自定义配置表,根据业务来判断插入到那一张表