mysql分表--MRG_MyISAM(Merge)引擎

0.735字数 1088阅读 1386

merge存储引擎基本介绍和使用规范说明【以下截自MySql手册】:

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选项。使用firstlast值使得插入被相应地做在第一或最后一个表上。如果你没有指定insert_method选项,或你用一个no值指定该选项。往merge表插入记录的试图导致错误。

了解完merge存储引擎之后我们需要思考几个问题:

1、根据什么样的规则来实现分表,即通过什么样的规则来插入不同的数据表?

2、即使分表成功,那么程序对其的处理是否简洁?


首先我们必须大概估算以后的数据量会多大,分多少张表比较合适,从而来确定分表规则。比如分三张表。user为主表,user_0、user_1、user_2为子表,先创建子表,结构与主表相同,在创建子表时注意要将engine=mrg_myisam(或engine=merge)替换为engine=myisam,否则会出现Unable to open underlying table which is differently defined or of non-MyISAM type or doesn't exist的错误提示,不能对主表进行查询

创建表:

create table user_1(

         id int(11) unsigned  not null ,

         name varchar(64) default null,

         sex  int(1) not null default 0,

         primary key(id)

)engine=myisam default charset = utf8mb4;

create table user_2(

         id int(11) unsigned  not null ,

         name varchar(64) default null,

         sex  int(1) not null default 0,

         primary key(id)

)engine=myisam default charset = utf8mb4;

create table user_3(

         id int(11) unsigned  not null ,

         name varchar(64) default null,

         sex  int(1) not null default 0,

         primary key(id)

)engine=myisam default charset = utf8mb4;

create table user(

         id int(11) unsigned  not null ,

         name varchar(64) default null,

         sex  int(1) not null default 0,

         primary key(id)

)engine=merge union=(user_1,user_2,user_3) insert_method=no;

insert_method=no表示不允许对本表进行insert操作。这个表仅仅只能进行select操作

那么对于插入操作该怎么搞?这里需要引入另外一张表,这张表就是用来产生唯一的id

create table user_unique_id(

         id int(11) unsigned  not null primary key auto_increment

)engine=myisam default charset = utf8;

php + mysql 完成  insert、delete、update、select 操作。

insert操作:

function get_user_unique_id() {

       $sql= "insert into user_unique_id(id) values('')";

       $this->db->query($sql);

       return  $this->db->insertID();

}

function  get_table_name($id) {

       return  'user_'.intval($id)%3;

}

function  user_add() {

       $id=$this->get_user_unique_id();

       $table_name=$this->get_table_name($id);

       $sql= "insert into {$table_name} (id,name,sex) values('{$id}','周杰伦',1)";

       $this->db->query($sql);

}

有了唯一id,delete、update、select操作就简单 了。

分表还有很多方法,希望对大家有帮助。innodb如何做分表并且保留事务和外键,具体还不清楚。

可以了解一下   

淘宝开源的中间件cobar实现mysql分库分表,这里

坚强版的cobar产品Mycat,这里

推荐阅读更多精彩内容