使用Merge存储引擎实现 mysql分表

时间:2022-09-18 20:31:01
分表就是把N条记录的表,分成若干个分表,各个分表记录的总和仍为N。

分表的方法有很多,用merge来分表,是最简单的一种方式.

Merge表的优点:

A: 分离静态的和动态的数据

B:利用结构接近的的数据来优化查询

C: 查询时可以访问更少的数据

D:更容易维护大数据集

E: 可以通过修改.mrg文件来修改Merge表,当然也可以用alter进行修改,修改后要通过FLUSH TABLES刷新表缓存,此法可以动态增加减少子表


merge是mysql的一种存储引擎,它把一组MyISAM数据表当做一个逻辑单元.

CREATE TABLE t1 (  a INT NOT NULL AUTO_INCREMENT PRIMARY KEY,  message CHAR(20))engine=myisam ;

CREATE TABLE t2 (  a INT NOT NULL AUTO_INCREMENT PRIMARY KEY,  message CHAR(20))engine=myisam ;

CREATE TABLE total (a INT NOT NULL AUTO_INCREMENT PRIMARY KEY, message CHAR(20)) ENGINE=MERGE UNION=(t1,t2) INSERT_METHOD=LAST;

即创建表的语句制定引擎即可:engine=myisam

另外,创建分表也可以用like,如:CREATETABLEt2liket1;
对应定期分表的情况下,只要定期相应的增加一个基础表,再修改merge表中的union就行了(ALTERTABLEtbl_nameUNION=(...))。
如在增加一个表(需和其他基础表一样的结构):

CREATE TABLE t3(a INT NOT NULL AUTO_INCREMENT PRIMARYKEY,message CHAR(20));
ALTER TABLE total UNION=(t1,t2,t3)

INSERT_METHOD=LAST;表示插入的方法,INSERT_METHOD的值可以是FIRST(插入第一个表),LAST(最后一个表),NO(不能插入)
查询的时候,和平常一样

select*fromtotalwhere....
merge表会自动找到相应的基础表进行查询。

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


不能直接删除一个分表,这样会破坏merge表。正确的方法是:
alter table t ENGINE=MRG_MyISAM UNION=(t1) INSERT_METHOD=LAST;
drop table t1