mysql分表--MRG_MyISAM(Merge)引擎

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 `test0` (
  `uin` int(10) unsigned NOT NULL,
  `data` text NOT NULL,
  `modtime` int(10) unsigned NOT NULL,
  PRIMARY KEY (`uin`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

CREATE TABLE `test1` (
  `uin` int(10) unsigned NOT NULL,
  `data` text NOT NULL,
  `modtime` int(10) unsigned NOT NULL,
  PRIMARY KEY (`uin`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

CREATE TABLE `test2` (
  `uin` int(10) unsigned NOT NULL,
  `data` text NOT NULL,
  `modtime` int(10) unsigned NOT NULL,
  PRIMARY KEY (`uin`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

CREATE TABLE `test3` (
  `uin` int(10) unsigned NOT NULL,
  `data` text NOT NULL,
  `modtime` int(10) unsigned NOT NULL,
  PRIMARY KEY (`uin`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

CREATE TABLE `test4` (
  `uin` int(10) unsigned NOT NULL,
  `data` text NOT NULL,
  `modtime` int(10) unsigned NOT NULL,
  PRIMARY KEY (`uin`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

CREATE TABLE `test5` (
  `uin` int(10) unsigned NOT NULL,
  `data` text NOT NULL,
  `modtime` int(10) unsigned NOT NULL,
  PRIMARY KEY (`uin`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

CREATE TABLE `test6` (
  `uin` int(10) unsigned NOT NULL,
  `data` text NOT NULL,
  `modtime` int(10) unsigned NOT NULL,
  PRIMARY KEY (`uin`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

CREATE TABLE `test7` (
  `uin` int(10) unsigned NOT NULL,
  `data` text NOT NULL,
  `modtime` int(10) unsigned NOT NULL,
  PRIMARY KEY (`uin`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

CREATE TABLE `test8` (
  `uin` int(10) unsigned NOT NULL,
  `data` text NOT NULL,
  `modtime` int(10) unsigned NOT NULL,
  PRIMARY KEY (`uin`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

CREATE TABLE `test9` (
  `uin` int(10) unsigned NOT NULL,
  `data` text NOT NULL,
  `modtime` int(10) unsigned NOT NULL,
  PRIMARY KEY (`uin`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

 

 

MERGE表代码为:

 

CREATE TABLE `test` (
  `uin` int(10) unsigned NOT NULL,
  `data` text NOT NULL,
  `modtime` int(10) unsigned NOT NULL,
  PRIMARY KEY  (`uin`),
  KEY `modtime` (`modtime`)
) ENGINE=MRG_MyISAM DEFAULT CHARSET=latin1 UNION=(`test0`,`test1`,`test2`,`test3`,`test4`,`test5`,`test6`,`test7`,`test8`,`test9`);

  那么对于插入操作该怎么搞?这里需要引入另外一张表,这张表就是用来产生唯一的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如何做分表并且保留事务和外键,具体还不清楚。



链接:https://www.jianshu.com/p/4320aaaec90d

posted @ 2022-09-20 09:34  星云惊蛰  阅读(801)  评论(0)    收藏  举报