我有一个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