mysql分表--MRG_MyISAM(Merge)引擎
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选项。使用first或last值使得插入被相应地做在第一或最后一个表上。如果你没有指定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,这里