MySQL 使用 MRG_MyISAM 存储引擎来实现分表

本文介绍了MySQL中的MRG_MyISAM存储引擎,包括其特点、使用方法及限制条件。通过实例展示了如何创建和操作MERGE表,以及如何指定插入方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原文链接:http://www.datastudy.cc/to/81

MRG_MyISAM存储引擎为MySQL的其中一个存储引擎,使用下面语句察看MYSQL数据库是否支持该存储引擎。


MERGE存储引擎,也被认识为MRG_MyISAM引擎,是一个相同的可以被当作一个来用的MyISAM表的集合。“相同”意味着所有表同样的列和索引信息。你不能合并列被以不同顺序列于其中的表,没有恰好同样列的表,或有不同顺序索引的表。而且,任何或者所有的表可以用myisampack来压缩的.

当你创建一个MERGE表之时,MySQL在磁盘上创建两个文件。文件名以表的名字开始,并且有一个扩展名来指明文件类型。一个.frm文件存储表定义,一个.MRG文件包含被当作一个来用的表的名字。这些表作为MERGE表自身,不必要在同一个数据库中。

你可以对表的集合用SELECT, DELETE, UPDATE和INSERT。你必须对你映射到一个MERGE表的这些表有SELECT, UPDATE和DELETE 的权限。

如果你DROP MERGE表,你仅在移除MERGE规格。底层表没有受影响。

当你创建一个MERGE表之时,你必须指定一个UNION=(list-of-tables)子句,它说明你要把哪些表当作一个来用。如果你想要对 MERGE表的插入发生在UNION列表中的第一个或最后一个表上,你可以选择地指定一个INSERT_METHOD选项。使用FIRST或LAST值使得插入被相应地做在第一或最后一个表上。如果你没有指定INSERT_METHOD选项,或你用一个NO值指定该选项。往MERGE表插入记录的试图导致错误。


使用案例:

CREATE TABLE IF NOT EXISTS `table1` (  
`id` int(11) NOT NULL AUTO_INCREMENT,  
`name` varchar(50) DEFAULT NULL,  
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;
  
CREATE TABLE IF NOT EXISTS `table2` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(50) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;
  
INSERT INTO `table1` (`name`) VALUES('name1');
  
INSERT INTO `table2` (`name`) VALUES('name2');

CREATE TABLE IF NOT EXISTS `uTable` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(50) DEFAULT NULL,
INDEX(id)
) ENGINE=MRG_MyISAM DEFAULT CHARSET=utf8 UNION=(table1,table2) INSERT_METHOD=LAST AUTO_INCREMENT=1;

select id,name from uTable;
+----+--------+
| id | name   |
+----+--------+
|  1 | name1  |
|  1 | name2  |
+----+--------+
2 rows in set (0.00 sec)

mysql> INSERT INTO `uTable` (`name`) VALUES('name3');
  
mysql> select id, name from table2  
 -> ;  
+----+-------+
| id | name  |
+----+-------+
|  1 | name2 |
|  2 | name3 |
+----+-------+
2 rows in set (0.00 sec)


<think>嗯,用户问的是-DWITH_MRG_MYISAM_STORAGE_ENGINE,我需要先确定这个选项的具体用途和适用场景。首先,这可能和MySQL存储引擎相关。MRG_MyISAM应该是Merge存储引擎,它允许将多个MyISAM表合并成一个逻辑表。 接下来,这个编译选项-DWITH_MRG_MYISAM_STORAGE_ENGINE应该是在编译MySQL时启用或禁用该存储引擎。用户可能在编译安装MySQL时遇到了问题,或者想知道是否需要启用这个选项。 需要确认默认情况下MySQL是否包含MRG_MyISAM引擎。根据以往的知识,MySQL的一些存储引擎在编译时是可选的,比如Merge引擎可能默认启用,但不同版本可能有差异。用户可能在自定义编译时想要排除不需要的引擎以减少资源占用,或者确保某个引擎被包含。 另外,用户可能想知道启用这个选项的影响。例如,如果启用,可以在创建表时使用ENGINE=MERGE或MRG_MyISAM来管理多个MyISAM表。这对于日志数据分区或者合并多个表的数据很有用。 还要考虑使用场景,比如是否适用于分区表,或者是否有性能上的考虑。可能存在的限制,比如Merge表不支持事务和全文索引,需要提醒用户注意。 另外,如果用户使用的是预编译的MySQL版本,可能不需要手动处理这个选项,因为大多数官方发行版默认已经包含常用引擎。但如果用户从源码编译,比如为了优化或定制,这时候就需要明确是否添加该选项。 可能还需要说明如何检查当前MySQL实例是否支持MRG_MyISAM,可以通过SHOW ENGINES;命令查看,这样用户可以自行验证。 总结回答结构:先介绍选项的作用,说明启用后的效果,适用场景,默认情况下的编译情况,以及如何检查是否支持,最后给出配置建议。</think>-DWITH_MRG_MYISAM_STORAGE_ENGINE 是 MySQL 源码编译时的一个配置选项,主要作用如下: ### 1. 功能说明 - **作用**:该选项用于控制是否在 MySQL 中编译并启用 `MRG_MyISAM` 存储引擎(也称为 Merge 引擎)。 - **存储引擎特性**: - 允许将多个结构相同的 `MyISAM` 表**逻辑合并**为一个虚拟表。 - 支持 `SELECT`/`INSERT`/`DELETE` 操作(但写入操作需直接操作底层表)。 - **不存储实际数据**,仅提供对底层表的统一访问接口。 ### 2. 典型使用场景 - **日志归档**:将历史日志按时间拆分存储为多个 `MyISAM` 表,通过 `MRG_MyISAM` 提供统一查询视图。 - **数据分片**:合并多个服务器的同结构表(需配合联合访问层)。 - **简化管理**:对应用程序隐藏物理表的拆分细节。 ### 3. 编译选项行为 - **启用**:`-DWITH_MRG_MYISAM_STORAGE_ENGINE=1`(默认值,多数官方二进制包已启用) - **禁用**:`-DWITH_MRG_MYISAM_STORAGE_ENGINE=0`(减少二进制体积,但场景极少需要) ### 4. 验证是否启用 ```sql SHOW ENGINES; ``` 输出中 `MRG_MYISAM` 的 `Support` 字段为 `YES` 表示已启用。 ### 5. 使用示例 ```sql -- 创建两个基础表 CREATE TABLE t1 (id INT) ENGINE=MyISAM; CREATE TABLE t2 (id INT) ENGINE=MyISAM; -- 创建 MERGE 表 CREATE TABLE mrg_t (id INT) ENGINE=MRG_MyISAM UNION=(t1,t2) INSERT_METHOD=LAST; -- 查询合并数据 SELECT * FROM mrg_t; ``` ### 6. 注意事项 - **写入限制**:直接操作 MERGE 表时,`INSERT_METHOD` 需指定为 `FIRST`/`LAST`/`NO`。 - **兼容性**:所有底层表必须与 MERGE 表结构完全一致。 - **替代方案**:MySQL 5.0+ 的分区表功能(Partitioning)在多数场景下更推荐使用
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值