MERGE存储引擎把一组MyISAM数据表当做一个逻辑单元来对待,让我们可以同时对他们进行查询,是一种简单的分表方案。
例如将日志表按日期分为 log_20221103, log_20221104 两张表
1 | CREATE TABLE `log_20221103` ( |
分别插入数据:
log_20221103:
id | log |
---|---|
1 | 1 |
2 | 2 |
3 | 3 |
log_20221104:
id | log |
---|---|
1 | a |
2 | b |
3 | c |
创建Merge表:
1 | CREATE TABLE `log_merge` ( |
执行select * from log_merge
将会得到如下结果:
id | log |
---|---|
1 | 1 |
2 | 2 |
3 | 3 |
1 | a |
2 | b |
3 | c |
从效果上看,两张表记录如同union在一起了一样, 但是需要注意的是:
1. 此表结构必须与基本表完全一致,包括列名、顺序。UNION表必须同属一个DATABASE。
2. 此表类似于SQL中的union机制。
3. 基本表类型必须是MyISAM的。
4. 可以通过修改.mrg文件来修改MERGE表,每个基本表的名字占一行。注意:修改后要通过FLUSH TABLES刷新表缓存。
5. 对基本表的更改可以直接反映在此表上。
6. INSERT_METHOD的取值可以是: 0 不允许插入 FIRST 插入到UNION中的第一个表 LAST 插入到UNION中的最后一个表。(4.0之后可用)
7. 定义在它上面的约束没有任何作用,约束是由基本表控制的,例如两个基本表中存在着同样的一个Key值,那么在MERGE表中会有两个一样的Key值。
8. 在数据量、查询量较大的情况下, 使用Merge表会很影响性能,原因参考2。
9. 查询结果及顺序与创建Merge表时联合表的顺序有关。
10. 当key一样的时候,修改Merge表内容会影响key对应的第一条数据,和9有关。
11. TRUNCATE Merge表的时候会同时truncate基础表,请慎重操作。
但是DELETE merge表的时候对基础表是没有影响的。