mysql的merge存储引擎应用

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/kunpeng1987/article/details/77750635

数据库中的数据量不一定是可控的,在未进行分表的情况下,随着时间和业务的发展,库中的表会越来越多,表中的数据量也会越来越大,相应地,数据操作,CURD的开销也会越来越大;另外,由于无法进行分布式式部署,而一台服务器的资源(CPU、磁盘、内存、IO等)是有限的,最终数据库所能承载的数据量、数据处理能力都将遭遇瓶颈。所以为了减小数据库的负担,缩短查询时间,常常需要对数据表进行分表的操作。常用的分表技术有两种:

第一种的思路是,预估一下可能的数据量,比如事先建100个这样的表,user_00,user_01,user_02……….user_98,user_99。然后根据用户的ID来判断这个用户的信息放到哪张表里面,你可以用hash的方式来获得,可以用求余的方式来获得,方法很多,各人想各人的吧。

第二种是,我们发现一个表数据量已经很大了,决定对它进行分表。假如我有一张用户表user,有100W条数据,现在要拆成二张表user1和user2,每张表50W条数据,
INSERT INTO user1(user1.id,user1.name,user1.sex)SELECT (user.id,user.name,user.sex)FROM user where user.id <= 500000
INSERT INTO user2(user2.id,user2.name,user2.sex)SELECT (user.id,user.name,user.sex)FROM user where user.id > 500000.
这样我就成功的将一张user表,分成了二个表,这个时候有一个问题,代码中的sql语句怎么办,以前是一张表,现在变成二张表了,代码改动很大,这样给程序员带来了很大的工作量,有没有好的办法解决这一点呢?办法是把以前的user表备份一下,然后删除掉,重新建一张user表,把这张user表的存储引擎设置为merge。

下面举例说说具体步骤:
创建user1,user2表:

CREATE TABLE `user1` (
  `id` int(10) unsigned NOT NULL,
  `name` VARCHAR(50) NOT NULL,
  `sex` TINYINT(10) unsigned NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

CREATE TABLE user2 LIKE user1;

插入测试数据:

INSERT INTO `user1` (`name`, `sex`) VALUES('张三', 0);

INSERT INTO `user2` (`name`, `sex`) VALUES('李四', 1);

创建合并表:

CREATE TABLE `users` (
  `id` int(10) unsigned NOT NULL,
  `name` VARCHAR(50) NOT NULL,
  `sex` TINYINT(1) unsigned NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MERGE DEFAULT CHARSET=utf8 union=(user1,user2) insert_method=last;

查询一下:

SELECT * FROM users;

这里写图片描述

这里需要注意:创建的合并表结构需要和分表保持完全一致,不然可能会出现问题。
比如,笔者就遇到过如下问题,

Unable to open underlying table which is differently defined or of non-MyISAM type or doesn't exist

首先排除一下是否有以下问题,
1、查看是不是有一些表不是MYISAM引擎的表,因为MERGE引擎只适用于MYISAM表
2、查看是不是在union的表中含有不存在的表。
3、查看是不是MERGE的时候引用了不在同一个库的表,并且该表没有指定数据库名字。
4、比较各个表的结构(索引、引擎、列、字符集等)是否一致。
如果没有以上问题,可以尝试这样创建users表,先创建,再修改。

create users like user1;
alter table users engine=merge union=(user1,user2) insert_method=last;

参考文章:
(1)、https://stackoverflow.com/questions/30879033/error-1168-hy000-mysql-merge-does-not-work
(2)、http://blog.51yip.com/mysql/949.html
(3)、http://blog.chinaunix.net/uid-20639775-id-3487060.html

猜你喜欢

转载自blog.csdn.net/kunpeng1987/article/details/77750635