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