mysql存储引擎MRG_MYISAM

论坛 期权论坛 脚本     
匿名技术用户   2020-12-30 07:31   11   0

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 一致问题, 自增主键引起冲突

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:7942463
帖子:1588486
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP