【Mysql 学习】MERGE存储引擎(一)

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介: MERGE存储引擎(一)MERGE表的问题   MERGE存储引擎,也被认识为MRG_MyISAM引擎,是一个相同的可以被当作一个来用的MyISAM表的集合。“相同”意味着所有表同样的列和索引信息。

MERGE存储引擎(一)
MERGE表的问题
   MERGE存储引擎,也被认识为MRG_MyISAM引擎,是一个相同的可以被当作一个来用的MyISAM表的集合。“相同”意味着所有表同样的列和索引信息。你不能合并列被以不同顺序列于其中的表,没有恰好同样列的表,或有不同顺序索引的表。而且,任何或者所有的表可以用myisampack来压缩。表选项的差异,比如AVG_ROW_LENGTH, MAX_ROWS或PACK_KEYS都不重要。
   当你创建一个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表插入记录的试图导致错误。

下面例子说明如何创建一个MERGE表:
mysql> create table pay_2009 (
    -> id int,
    -> pay_date datetime,
    -> amount decimal(15,3),
    -> key idx_fk_id(id)
    -> ) engine=myisam;
Query OK, 0 rows affected (0.06 sec)

mysql> create table pay_2010 (
    -> id int,
    -> pay_date datetime,
    -> amount decimal(15,3),
    -> key idx_fk_id(id)
    -> ) engine=myisam;
Query OK, 0 rows affected (0.13 sec)

mysql> create table pay_all (
    -> id int,
    -> pay_date datetime,
    -> amount decimal(15,3),
    -> index (id)
    -> ) engine=merge union=(pay_2009,pay_2010) insert_method=first;
Query OK, 0 rows affected (0.09 sec)
mysql> insert into pay_2009 values(1,'2009-09-27',10000),(2,'2009-09-17',20000);
Query OK, 2 rows affected (0.00 sec)
Records: 2  Duplicates: 0  Warnings: 0

mysql> insert into pay_2010 values(1,'2010-09-27',10000),(2,'2010-09-17',20000);
Query OK, 2 rows affected (0.02 sec)
Records: 2  Duplicates: 0  Warnings: 0

 

mysql>
注意,一个列在MERGEN表中被索引,但没有被宣告为一个PRIMARY KEY,因为它是在更重要的MyISAM表中。这是必要的,因为MERGE表在更重要的表中的设置上强制非唯一性。

创建MERGE表之后,你可以发出把一组表当作一体来操作的查询:

mysql> select * from pay_2009;
+------+---------------------+-----------+
| id   | pay_date            | amount    |
+------+---------------------+-----------+
|    1 | 2009-09-27 00:00:00 | 10000.000 |
|    2 | 2009-09-17 00:00:00 | 20000.000 |
+------+---------------------+-----------+
2 rows in set (0.00 sec)

mysql> select * from pay_2010;
+------+---------------------+-----------+
| id   | pay_date            | amount    |
+------+---------------------+-----------+
|    1 | 2010-09-27 00:00:00 | 10000.000 |
|    2 | 2010-09-17 00:00:00 | 20000.000 |
+------+---------------------+-----------+
2 rows in set (0.00 sec)

mysql> select * from pay_all;
+------+---------------------+-----------+
| id   | pay_date            | amount    |
+------+---------------------+-----------+
|    1 | 2009-09-27 00:00:00 | 10000.000 |
|    2 | 2009-09-17 00:00:00 | 20000.000 |
|    1 | 2010-09-27 00:00:00 | 10000.000 |
|    2 | 2010-09-17 00:00:00 | 20000.000 |
+------+---------------------+-----------+
4 rows in set (0.00 sec)

mysql> insert into pay_all values(3,'2009-12-02',80000);
Query OK, 1 row affected (0.00 sec)

mysql> select * from pay_2009;
+------+---------------------+-----------+
| id   | pay_date            | amount    |
+------+---------------------+-----------+
|    1 | 2009-09-27 00:00:00 | 10000.000 |
|    2 | 2009-09-17 00:00:00 | 20000.000 |
|    3 | 2009-12-02 00:00:00 | 80000.000 |
+------+---------------------+-----------+
3 rows in set (0.00 sec)

mysql> select * from pay_2010;
+------+---------------------+-----------+
| id   | pay_date            | amount    |
+------+---------------------+-----------+
|    1 | 2010-09-27 00:00:00 | 10000.000 |
|    2 | 2010-09-17 00:00:00 | 20000.000 |
+------+---------------------+-----------+
2 rows in set (0.00 sec)

mysql> select * from pay_all;
+------+---------------------+-----------+
| id   | pay_date            | amount    |
+------+---------------------+-----------+
|    1 | 2009-09-27 00:00:00 | 10000.000 |
|    2 | 2009-09-17 00:00:00 | 20000.000 |
|    3 | 2009-12-02 00:00:00 | 80000.000 |
|    1 | 2010-09-27 00:00:00 | 10000.000 |
|    2 | 2010-09-17 00:00:00 | 20000.000 |
+------+---------------------+-----------+
5 rows in set (0.00 sec)
注意,你也可以直接从MySQL之外直接操作.MRG文件:

相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
存储 关系型数据库 MySQL
【Mysql 学习】 MERGE表方面的问题(二)
shell> cd /mysql-data-directory/current-databaseshell> ls -1 t1 t2 > total.MRGshell> mysqladmin flush-tables要重映射一个MERGE表到一个不同的MyISAM表集,你可以执行下列之一: ·DROP MERGE表并且重建它。
727 0
|
2月前
|
SQL 存储 数据管理
阿里云视觉智能开放平台的逻辑数仓基于统一的SQL语法
【2月更文挑战第9天】阿里云视觉智能开放平台的逻辑数仓基于统一的SQL语法
52 2
|
3月前
|
存储 关系型数据库 MySQL
在阿里云的AnalyticDB MySQL版中使用CREATE TABLE语句来创建内表
在阿里云的AnalyticDB MySQL版中使用CREATE TABLE语句来创建内表【1月更文挑战第16天】【1月更文挑战第78篇】
210 3
|
4月前
|
关系型数据库 MySQL BI
用友畅捷通基于阿里云 EMR StarRocks 搭建实时湖仓实战分享
本文从用友畅捷通公司介绍及业务背景;数据仓库技术选型、实际案例及未来规划等方面,分享了用友畅捷通基于阿里云 EMR StarRocks 搭建实时湖仓的实战经验。
601 0
用友畅捷通基于阿里云 EMR StarRocks 搭建实时湖仓实战分享
|
4月前
电子好书发您分享《阿里云云原生一体化数仓新能力解读》
电子好书发您分享《阿里云云原生一体化数仓新能力解读》
262 2
|
1月前
|
分布式计算 关系型数据库 OLAP
阿里云AnalyticDB基于Flink CDC+Hudi实现多表全增量入湖实践
阿里云AnalyticDB基于Flink CDC+Hudi实现多表全增量入湖实践
77 0
|
4月前
|
SQL BI Apache
奇富科技基于阿里云数据库 SelectDB 版内核 Apache Doris 的统一 OLAP 场景探索实践
Apache Doris 作为整体 OLAP 场景,助力奇富科技信贷科技服务平台优化,使得报表分析场景 SLA 达标率提升至 99% 以上,平均查询耗时降低 50%,为营销活动、广告投放等提供强有力的数据支持。
奇富科技基于阿里云数据库 SelectDB 版内核 Apache Doris 的统一 OLAP 场景探索实践
|
4月前
电子好书发您分享《阿里云云原生一体化数仓新能力解读》
电子好书发您分享《阿里云云原生一体化数仓新能力解读》
74 1
|
4月前
电子好书发您分享《阿里云云原生一体化数仓新能力解读》
电子好书发您分享《阿里云云原生一体化数仓新能力解读》
128 1
|
4月前
|
存储 分布式计算 关系型数据库
AnalyticDB MySQL湖仓版是阿里云推出的一款产品
AnalyticDB MySQL湖仓版是阿里云推出的一款产品
98 3