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)
begindeclare i int default 1;while i<&#61;count do INSERT INTO userinfo values(i,uuid(),CEILING(RAND()*90&#43;10),FLOOR(RAND()*100000000000),round(FORMAT(rand(),1)),uuid(),now(),now(),uuid(),CEILING(RAND()*90&#43;10));set i&#61;i&#43;1;end while;
end
- 调用存储过程&#xff0c;插入100W数据&#xff1a;
call test_insert(1000000);
1.2 使用myisampack工具
- 查看数据库物理存储路径
进入具体目录&#xff1a;
压缩之前的数据文件大小&#xff08;MYD&#xff09;&#xff1a;149M&#xff0c;索引文件大小&#xff08;MYI&#xff09;&#xff1a;9.8M
- 使用压缩工具
myisampack
压缩表&#xff1a;
myisampack table_name
myisampack userinfo
压缩之后的数据文件大小&#xff08;MYD&#xff09;&#xff1a;65M&#xff0c;索引文件大小&#xff08;MYI&#xff09;&#xff1a;1.0K。
1.3 压缩带来的问题
出现&#xff1a;Table ‘userinfo’ is marked as crashed and should be repaired
大概意思是userinfo表崩溃了&#xff0c;需要修复。
使用压缩工具&#xff0c;压缩后的表&#xff0c;有非常大的概率崩溃。&#xff08;大家可以自行测试一下&#xff09;
还好&#xff0c;我们可以修复&#xff1a;
repair table userinfo;
再次使用其他客户端查看表数据&#xff1a;
有得时候压缩过后的数据并不能通过repair table
语句修复&#xff0c;建议在压缩之前&#xff0c;先做好数据备份。
1.4 解压缩工具myisamchk
MySQL官方建议我们&#xff0c;使用myisampack工具压缩过后的数据&#xff0c;为只读模式&#xff08;当然你可以强行修改数据&#xff09;&#xff0c;但最好不要做数据的修改&#xff08;增删改&#xff09;&#xff0c;如果要做数据的修改&#xff0c;请用myisamchk
来解压缩。
1.4.1 强制修改
我们现在把表重新删除&#xff0c;重新插入100W数据&#xff0c;然后使用myisampack
工具进行压缩。
之后我们尝试修改数据中的记录&#xff1a;
mysql> call test_insert(1000000);
Query OK, 1 row affected (26.53 sec)mysql> select count(1) from userinfo;
&#43;
| count(1) |
&#43;
| 1000000 |
&#43;
1 row in set (0.00 sec)mysql> update userinfo set username&#61;&#39;1&#39; where id&#61;1;
ERROR 126 (HY000): Incorrect key file for table &#39;./test/userinfo.MYI&#39;; try to repair it
mysql>
发现出现&#xff1a;ERROR 126 (HY000): Incorrect key file for table ‘./test/userinfo.MYI’; try to repair it
大概意思是索引文件损坏。
我们再次尝试修复表&#xff1a;
发现可以修改&#xff0c;但是MySQL官方不建议这样做&#xff0c;建议压缩的表只作为只读&#xff0c;如果想要修改&#xff0c;那么请使用myisamchk
工具解压缩。
1.4.2 解压缩修改
为了防止其他因素干扰&#xff0c;我们把表重新删除&#xff08;drop table&#xff09;&#xff0c;重新建立一张表&#xff0c;插入100W数据测试。
- 窗口一
- 窗口二&#xff1a;
其实解压缩过后&#xff0c;原来的数据大小还是被压缩了&#xff0c;只是索引文件变回了原来的大小。
好了&#xff0c;本篇就说到这里了&#xff0c;看完觉得有帮助的童鞋记得点赞&#xff01;