欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

MySQL使用MRG_MyISAM(MERGE)实现分表后查询的示例

程序员文章站 2022-06-21 11:06:30
数据库大数据量优化是一门很大的学问,也是做为一名开发者需要掌握的专业技能。mysql分表方式分为垂直分表和水平分表,这两种分表形式都比较简单,简单理解垂直分表指的是:表的记录并不多,但是字段却很长,表...

数据库大数据量优化是一门很大的学问,也是做为一名开发者需要掌握的专业技能。

mysql分表方式分为垂直分表和水平分表,这两种分表形式都比较简单,简单理解垂直分表指的是:表的记录并不多,但是字段却很长,表占用空间很大,检索表的时候需要执行大量的io,严重降低了性能。这时需要把大的字段拆分到另一个表,并且该表与原表是一对一的关系。而水平分表则是在同一个数据库内,把同一个表的数据按一定规则拆到多个表中,目的是优化单一表数据量过大而产生的性能问题,避免io争抢并减少锁表的几率。

实现分表很简单,复杂的是分表之后如何查询数据?今天的实现方式是使用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选项。使用first或last值使得插入被相应地做在第一或最后一个表上。如果你没有指定insert_method选项,或你用一个no值指定该选项。往merge表插入记录的试图导致错误。

举个例子:
创建两个子分表:

create table `yzm_table1` (
  `id` int(10) unsigned not null,
  `title` varchar(100) not null default '',
  `content` varchar(255) not null default '',
  primary key (`id`)
) engine=myisam default charset=utf8;

create table `yzm_table2` (
  `id` int(10) unsigned not null,
  `title` varchar(100) not null default '',
  `content` varchar(255) not null default '',
  primary key (`id`)
) engine=myisam default charset=utf8;

表创建完毕了,需要注意的是这里的id不能设为自增,而且所有的表结构必须一致,包括结构,类型,长度,字段的顺序都必须一致那么对于这个id如何取得呢?后面我会详细说明。现在,我们需要一个合并表,用于查询,创建合并表的代码如下:

create table `yzm_table` (
  `id` int(10) unsigned not null auto_increment,
  `title` varchar(100) not null default '',
  `content` varchar(255) not null default '',
  primary key (`id`)
) engine=mrg_myisam default charset=utf8 insert_method=no insert_method=last union=(`yzm_table1`,`yzm_table2`);

合并表也必须和前面的表有相同的结构,类型,长度,包括字段的顺序都必须一致这里的 insert_method=no 表示不允许对本表进行insert操作。好了,当需要查询的时候,我们可以只对yzm_table这个表进行操作就可以了,也就是说这个表仅仅只能进行select操作。

插入一些数据测试:

insert into `yzm_table1` values ('1', 'table1-1', 'content1-1');
insert into `yzm_table1` values ('2', 'table1-2', 'content1-2');
insert into `yzm_table2` values ('3', 'table2-1', 'content2-1');
insert into `yzm_table2` values ('4', 'table2-2', 'content2-2');
insert into `yzm_table2` values ('5', 'table2-3', 'content2-3');

然后查询合并表(主表)

select * from `yzm_table` limit 10;

果然可以查询到所有关联子表的所有数据,这样就可以对所有的数据进行分页、统计等查询了。

以上就是mysql使用mrg_myisam(merge)实现分表后查询的示例的详细内容,更多关于mysql 分表后查询的资料请关注其它相关文章!