如何更安全地使用MyISAM表?

时间:2008-09-16 19:10:34

标签: mysql innodb myisam database-integrity

我喜欢InnoDB的安全性,一致性和自我检查。

但我需要MyISAM的速度和重量。

如何使MyISAM不易因崩溃,数据不良等而导致损坏?通过检查需要永远(CHECK TABLE或myisamchk)。

我不是要求交易安全性 - 这就是InnoDB的用途。但我确实想要一个数据库,我可以快速重启,而不是几小时(或几天!)。

更新:我不是问如何更快地将数据加载到表中。我已经打败了我的头,并确定使用MyISAM表来获取我的LOAD DATA要快得多。我现在所追求的是减轻使用MyISAM表的风险。也就是说,减少伤害的机会,提高恢复速度。

8 个答案:

答案 0 :(得分:3)

MyISAM的速度优势实际上可以很快消失 - 事实上它缺乏行级锁定意味着小的更新可能导致大量数据被锁定,查询被阻止。因此,我对声称MyISAM速度优势持怀疑态度:开始做几次UPDATE,每秒的查询都会有效。

我认为你最好问“用InnoDB支持的应用程序怎么能更快?”然后答案处理轻量级缓存中的缓存数据(可能是在对象级别) - ACID会产生成本,而对于Web应用程序来说,并不是真的需要它。

如果UPDATE很少(如果不是,MyISAM不是一个好选择),那么你甚至可以使用MySQL查询缓存。

memcached(http://www.danga.com/memcached/)是一种非常受欢迎的对象缓存选项。根据您的应用程序,您还有其他选项(HTTP缓存等)

答案 1 :(得分:1)

在某些情况下,MyISAM的性能优势实际上非常小;你需要对自己的应用程序MyISAM和InnoDB进行基准测试。使用InnoDB事务引擎也可以带来其他好处。

在我的测试中,InnoDB通常会占用比MyISAM多150%的磁盘空间 - 这是因为它的块结构和缺少索引压缩。

如果你负担得起,只需使用InnoDB。

就回答您的实际问题而言:如果您将表分区为多个MyISAM表,则崩溃所需的修复量将会少得多;如果你的数据很大,那么出于其他原因,这可能是一个好主意。

答案 2 :(得分:1)

在正常情况下,你不应该腐败。如果你正在腐败,你需要看看坏内存,坏硬盘,糟糕的驱动器控制器或可能是一个mysql错误。

如果你想支持所有这些,你可以设置一个复制从属。当主服务器死亡时,停止从服务器上的复制并使其成为新的主服务器。清除旧主站的数据并将其设置为从站。用户停机时间将限制为检测到主人死亡并使奴隶上升所需的时间。

这样做的另一个好处是可以实现零停机时间备份:关闭从站进程并备份从站。

答案 3 :(得分:1)

虽然我同意innodb的评论,但我会解决你的MyISAM问题。

防止腐败和提高速度的好方法是使用MERGE tables

您可以使用2个或更多MyISAM文件。一种是通常用于备份的旧数据,这些数据经常不使用,另一种是较新的数据。然后,您的硬盘上将有2个FRM(MyISAM表文件),其中一个将受到保护。通常你compress旧的MyISAM表,然后它们肯定不会被破坏,因为它们变成只读的。

此技术通常用于加速大型MyISAM表,但您也可以在此处应用它。

希望这有助于你的问题。虽然我意识到它并没有真正帮助防止崩溃的MyISAM,但它确实提供了相当多的保护。

答案 4 :(得分:0)

你和MySQL结婚了吗? Postgres符合ACID标准(如innoDB)和(经过良好调整)与MyISAM一样快。

答案 5 :(得分:0)

您的评论:

  

不,主要问题是惊人的   磁盘密集型初始导入数据   进入表格。 MyISAM时间:12   分钟。 InnoDB时间:3小时以上。在我之后   初始加载,UPDATE不存在   和INSERT很少见。不知道   InnoDB的解决方案令人失望   加载操作。

建议删除约束和索引,然后在加载后启用/重建它们可能会显着加快它 - 我假设你试过了吗?这改善了吗?

答案 6 :(得分:0)

这真的很大程度上取决于你如何使用表格。如果它们写得很重,那么您可能需要考虑删除索引,这将加快恢复时间。如果读取它们很重,您可能需要考虑使用复制,它将序列化对表的所有写入,从而最大限度地缩短崩溃后读取副本的恢复时间。

您可以做的就是写入表的InnoDB副本,然后复制到MyISAM副本。无论如何,MyISAM的性能优势大多是面向读者的。

当然,使用复制,读写之间会有延迟时间

答案 7 :(得分:0)

获得良好的UPS,具有良好的功率调节。在稳定和冗余的硬件上运行。

我不相信MyISAM表在写入过程中遇到崩溃,所以我认为最好的办法是减少崩溃(和写入)的发生。