减lessMyISAM表的大小

我有一个MyISAM表,目前包含约54万条logging,大小为20 GB。 这个数据库devise时做出的select不当。 我不是数据库专业人士,但是由于这张表经常被写入,而且很less被查询,所以看起来InnoDB将是一个更好的select。 问题是这张表几乎总是可以写入的。 其中一个字段是时间戳字段。 logging回溯5年 – 我只需要保留过去6个月。 我已经尝试了一些删除操作,大约需要20分钟时间来删除200,000行,在此期间表被locking,无法写入。 有没有人有如何减less这个表的大小,而不被locking几个小时的build议? 有没有更快的方法来删除不需要的行? 我从来没有将MyISAM表转换成InnoDB表。 这是一个漫长的过程?

我终于有时间重新审视这个项目,为了完整起见,我想发布我最终做的事情。 我相信,DELETE FROM原来的问题与我如何指定要删除的行有关。 我正在使用类似的声明

DELETE FROM table WHERE starttime < 20150101 limit 200000; 

starttime字段实际上是一个DATETIME。 我结束了使用创build一个新的表

 CREATE TABLE new_table LIKE existing_table; 

然后更改新表的引擎

 ALTER TABLE new_table ENGINE=InnoDB; 

然后重命名

 RENAME TABLE existing_table TO old_table, new_table TO existing_table; 

在此之后,我需要从旧表中获取6个月的数据

 INSERT INTO existing_table SELECT * FROM old_table WHERE starttime BETWEEN DATE_SUB(NOW(), INTERVAL 6 MONTH) AND NOW(); 

谢谢Martin的build议。 我在serverfault是新的,所以我不知道如何将他的评论标记为答案。

MyISAM只适用于SELECT。 Innodb具有独立的READ和WRITE队列。 所以当你删除200,000行时表不会被locking。 表锁是MyISAM投入生产时的一大限制。 InnoDB对于大多数应用来说比MyISAM慢,但由于更好的locking机制,在某些情况下可以执行得更快。 当插入/更新执行时,MyISAMlocking整个表格进行读取。 InnoDB可以执行行级locking,从而允许多个并发写入和在表上读取

http://kakadba.blogspot.in/2014/02/innodb-vs-myisam.html

将MyISAM转换为INNODB

你可以一桌一桌地做

 ALTER TABLE table_name ENGINE=InnoDB; 

或者你可以尝试脚本一次完成

https://stackoverflow.com/questions/3856435/how-to-convert-all-tables-from-myisam-into-innodb