MyISAM引擎压缩工具myisampack

追求适度,才能走向成功;人在顶峰,迈步就是下坡;身在低谷,抬足既是登高;弦,绷得太紧会断;人,思虑过度会疯;水至清无鱼,人至真无友,山至高无树;适度,不是中庸,而是一种明智的生活态度。

导读:本篇文章讲解 MyISAM引擎压缩工具myisampack,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

MyISAM引擎压缩工具myisampack

我们知道MyISAM存储引擎表提供有三种,分别为静态表、动态表、压缩表。(本文主要讲压缩表)

1.1 数据准备

  • 准备一张测试表(存储引擎是MyISAM):
CREATE TABLE `userinfo` (
  `id` int(10) NOT NULL COMMENT '用户id',
  `username` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '用户名',
  `age` int(3) NULL DEFAULT NULL COMMENT '年龄',
  `phone` varchar(15) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '手机号',
  `gender` char(1) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '性别: ‘0’-男   ‘1’-女',
  `desc` text CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '自我介绍',
  `register_time` datetime(0) NULL DEFAULT NULL COMMENT '注册时间',
  `login_time` datetime(0) NULL DEFAULT NULL COMMENT '上一次登录时间',
  `pic` varchar(250) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '头像地址',
  `look` int(10) NULL DEFAULT NULL COMMENT '查看数',
  PRIMARY KEY (`id`)
) ENGINE = MyISAM CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;
  • 编写一个存储过程,用于后续批量插入数据:
CREATE PROCEDURE `test_test`(count int)
begin
		declare i int default 1;
		while i<=count do 
			INSERT INTO userinfo values(
			i,
			uuid(),
			CEILING(RAND()*90+10),
			FLOOR(RAND()*100000000000),
			round(FORMAT(rand(),1)),
			uuid(),
			now(),
			now(),
			uuid(),
			CEILING(RAND()*90+10)
			);
			set i=i+1;
		end while;
end
  • 调用存储过程,插入100W数据:
call test_insert(1000000);

在这里插入图片描述

1.2 使用myisampack工具

  • 查看数据库物理存储路径
    在这里插入图片描述
    进入具体目录:
    在这里插入图片描述

压缩之前的数据文件大小(MYD):149M,索引文件大小(MYI):9.8M

  • 使用压缩工具myisampack压缩表:
myisampack table_name
myisampack userinfo

在这里插入图片描述

压缩之后的数据文件大小(MYD):65M,索引文件大小(MYI):1.0K。

1.3 压缩带来的问题

在这里插入图片描述

出现:Table ‘userinfo’ is marked as crashed and should be repaired

大概意思是userinfo表崩溃了,需要修复。

使用压缩工具,压缩后的表,有非常大的概率崩溃。(大家可以自行测试一下)

还好,我们可以修复:

repair table userinfo;

在这里插入图片描述
再次使用其他客户端查看表数据:
在这里插入图片描述

有得时候压缩过后的数据并不能通过repair table语句修复,建议在压缩之前,先做好数据备份。

1.4 解压缩工具myisamchk

MySQL官方建议我们,使用myisampack工具压缩过后的数据,为只读模式(当然你可以强行修改数据),但最好不要做数据的修改(增删改),如果要做数据的修改,请用myisamchk来解压缩。

1.4.1 强制修改

我们现在把表重新删除,重新插入100W数据,然后使用myisampack工具进行压缩。

之后我们尝试修改数据中的记录:

mysql> call test_insert(1000000);
Query OK, 1 row affected (26.53 sec)

mysql> select count(1) from userinfo;
+----------+
| count(1) |
+----------+
|  1000000 |
+----------+
1 row in set (0.00 sec)

mysql> update userinfo set username='1' where id=1;
ERROR 126 (HY000): Incorrect key file for table './test/userinfo.MYI'; try to repair it
mysql> 

发现出现:ERROR 126 (HY000): Incorrect key file for table ‘./test/userinfo.MYI’; try to repair it

大概意思是索引文件损坏。

我们再次尝试修复表:
在这里插入图片描述
发现可以修改,但是MySQL官方不建议这样做,建议压缩的表只作为只读,如果想要修改,那么请使用myisamchk工具解压缩。

1.4.2 解压缩修改

为了防止其他因素干扰,我们把表重新删除(drop table),重新建立一张表,插入100W数据测试。

  • 窗口一
    在这里插入图片描述
  • 窗口二:
    在这里插入图片描述

其实解压缩过后,原来的数据大小还是被压缩了,只是索引文件变回了原来的大小。

好了,本篇就说到这里了,看完觉得有帮助的童鞋记得点赞!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/131828.html

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!