Mrg_Myisam
Merge存储引擎,是一组MyIsam的组合,也就是说,他将MyIsam引擎的多个表聚合起来,但是他的内部没有数据,真正的数据依然是MyIsam引擎的表中,但是可以直接进行查询、删除更新等操作。
可以直接从数据表里面操作, 也可以直接在mrg表里面, 删除mrg表, 不会影响实际表的数据。
测试sql
CREATE TABLE `test_engin_mrg_1` ( `c_id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID', `c_uid` int(11) unsigned NOT NULL COMMENT 'uidID', `c_name` varchar(64) NOT NULL COMMENT '姓名', `c_age` tinyint(3) DEFAULT NULL COMMENT '年龄', `c_email` varchar(64) DEFAULT '0' COMMENT '邮箱', `create_time` timestamp NULL DEFAULT NULL COMMENT '插入时间', `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', PRIMARY KEY (`c_id`), KEY `idx_uid` (`c_uid`) USING BTREE ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='测试mrg_myisam1'; CREATE TABLE `test_engin_mrg_2` ( `c_id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID', `c_uid` int(11) unsigned NOT NULL COMMENT 'uidID', `c_name` varchar(64) NOT NULL COMMENT '姓名', `c_age` tinyint(3) DEFAULT NULL COMMENT '年龄', `c_email` varchar(64) DEFAULT '0' COMMENT '邮箱', `create_time` timestamp NULL DEFAULT NULL COMMENT '插入时间', `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', PRIMARY KEY (`c_id`), KEY `idx_uid` (`c_uid`) USING BTREE ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='测试mrg_myisam2'; CREATE TABLE `test_engin_mrg_u` ( `c_id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID', `c_uid` int(11) unsigned NOT NULL COMMENT 'uidID', `c_name` varchar(64) NOT NULL COMMENT '姓名', `c_age` tinyint(3) DEFAULT NULL COMMENT '年龄', `c_email` varchar(64) DEFAULT '0' COMMENT '邮箱', `create_time` timestamp NULL DEFAULT NULL COMMENT '插入时间', `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', PRIMARY KEY (`c_id`), KEY `idx_uid` (`c_uid`) USING BTREE ) ENGINE=MRG_MyISAM DEFAULT CHARSET=utf8 INSERT_METHOD=LAST UNION=(`test_engin_mrg_1`,`test_engin_mrg_2`) COMMENT='测试 test_engin_mrg_u'; SELECT * FROM test_engin_mrg_u; SELECT * FROM test_engin_mrg_1; SELECT * FROM test_engin_mrg_2; INSERT INTO test_engin_mrg_1(c_uid,c_name) VALUES(11,'name11'),(12,'name12'); INSERT INTO test_engin_mrg_2(c_uid,c_name) VALUES(11,'name11'),(12,'name12'); INSERT INTO test_engin_mrg_u(c_uid,c_name) VALUES(11,'name11'),(12,'name12'); DROP TABLE test_engin_mrg_u; -- 不会对底层存储表产生影响 -- 重新建表依然可以使用mrg
存储是基于 MyISAM的引擎的表, 对于业务可以拆分,多读多写,少更新的场景, 可以采用MRG_MyISAM实现数据库的简单分片。
但是基于MRG_MyISAM的存储会有如下问题
1. 未指明 实际存储表的大查询, 会有更多的merge操作,并且不走索引, 建议使用union all 代替
2. 多表引起的 id 一致问题, 自增主键引起冲突