Merge存储引擎

对于数据量很大的一张表,i/o效率底下,分表势在必行!

使用程序分,对不同的查询,分配到不同的子表中,是个解决方案,但要改代码,对查询不透明。

好在mysql 有两个解决方案:

Partition(分区,在MySQL 5.1.中实现) 和 Mysql Merge存储引擎。

本文讨论 Mysql Merge存储引擎。

DROP TABLE IF EXISTS merge_t1;
CREATE TABLE merge_t1 ( i INT NOT NULL AUTO_INCREMENT PRIMARY KEY, message CHAR (20) ) ENGINE = MyISAM;

DROP TABLE IF EXISTS merge_t2;
CREATE TABLE merge_t2 ( i INT NOT NULL AUTO_INCREMENT PRIMARY KEY, message CHAR (20) ) ENGINE = MyISAM;

INSERT INTO merge_t1 (message) VALUES('Testing'),('table'),('t1');

INSERT INTO merge_t2 (message) VALUES('Testing'),('table'),('t2');

DROP TABLE IF EXISTS total;
CREATE TABLE total ( i INT NOT NULL AUTO_INCREMENT PRIMARY KEY, message CHAR (20) ) ENGINE = MERGE UNION = (merge_t1, merge_t2) INSERT_METHOD = LAST;

对应定期分表的情况下,只要定期相应的增加一个基础表,再修改merge表中的 union 就行了(ALTER TABLE tbl_name UNION=(…))。

如在增加一个表(需和其他基础表一样的结构):

CREATE TABLE merge_t3 LIKE merge_t1;  

ALTER TABLE total UNION = (merge_t1, merge_t2, merge_t3);

INSERT_METHOD=LAST;表示插入的方法,INSERT_METHOD的值可以是 FIRST(插入第一个表),LAST(最后一个表),NO(不能插入)

查询的时候,和平常一样

select * from total where ....

merge表会自动找到相应的基础表进行查询,即对于merge表的增删改查,最终都会作用于底层的MyISAM表。

例如对于上面的表,现在执行如下语句

INSERT INTO total(message) VALUES ('Testing'),('table'),('t3');
SELECT * FROM total;

执行结果如下:
这里写图片描述

可以看到对于total的插入语句最终反映到了merge_t3 中,并且merge_t3 中的主键编号并不是从1开始的。

需要注意的是 merge表并不维护 “唯一性”检查,唯一性有各基础表完成。所以插入新的记录时候可能和其他基础表的内容重复。所以再插入去需要用代码进行唯一性检查。

详情参考:
http://dev.mysql.com/doc/refman/5.1/en/merge-storage-engine.html

转载于:https://my.oschina.net/u/3055303/blog/878940

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值