如何更安全地使用MyISAM表?

时间:2020-03-05 18:56:54  来源:igfitidea点击:

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

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

如何使MyISAM减少因崩溃,数据损坏等导致的损坏?它需要永远进行检查(CHECK TABLE或者myisamchk)。

我不是在要求事务安全-这就是InnoDB的目的。但是我确实希望我可以快速重启数据库,而不是几个小时(或者几天!)。

更新:我不是在问如何更快地将数据加载到表中。我已经反对了这一点,并确定使用MyISAM表作为LOAD DATA的速度快得多。我现在要减轻的是使用MyISAM表的风险。即,减少损坏的机会,提高恢复速度。

解决方案

回答

我们已嫁给MySQL吗? Postgres是ACID兼容的(如innoDB),并且(经过适当调整)的速度几乎与MyISAM一样快。

回答

MyISAM所谓的速度优势实际上可以很快消失,因为它没有行级锁定,这意味着小的更新可能会导致锁定大量数据并阻塞查询。因此,我对声称的MyISAM速度优势表示怀疑:开始执行多个UPDATE,每秒查询将增加。

我认为我们最好问一下"如何才能使使用InnoDB支持的应用程序更快?"然后答案就涉及到在轻量级缓存中缓存数据,也许是在对象级别缓存数据,而ACID则要付出一定的代价,例如,对于Web应用程序,则并不需要。

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

memcached(http://www.danga.com/memcached/)是对象缓存非常流行的选项。根据应用程序,我们还可以选择其他选项(HTTP缓存等)。

回答

在某些情况下,MyISAM的性能优势实际上很小。我们需要对自己的应用程序MyISAM与InnoDB进行基准测试。独家使用InnoDB事务引擎还具有其他好处。

在我的测试中,由于InnoDB的块结构和缺乏索引压缩功能,因此它通常比MyISAM占用大约150%的磁盘空间。

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

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

回答

你的评论:

No, the major problem is the amazingly
  disk-intensive initial import of data
  into the table. MyISAM time: 12
  minutes. InnoDB time: 3+ hrs. After my
  initial load, UPDATEs are non-existent
  and INSERTs are rare. No known
  solution to InnoDB's disappointing
  load operation.

建议删除约束和索引,然后在加载后启用/重建它们可能会大大加快加载速度我认为我们尝试过吗?这有改善吗?

回答

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

一旦我们能做的就是写入表的InnoDB副本,然后复制到MyISAM副本。无论如何,MyISAM的性能优势大多是面向读取的。

当然使用复制,读取和写入之间会有时间间隔

回答

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

我不相信MyISAM表在写操作期间会因崩溃而幸免,因此我认为最好的选择是减少崩溃(和写操作)的发生。

回答

通常情况下,我们不应该腐败。如果我们正在损坏,则需要查看内存不足,硬盘驱动器,驱动器控制器故障或者可能是mysql错误之类的问题。

如果我们想回避所有这些,则可以设置复制从属。当主服务器死后,停止从服务器上的复制并将其设置为新的主服务器。清除旧主机上的数据并将其设置为从机。用户停机时间将受限于检测到主机死亡并启动从机所需的时间。

这是实现零停机时间备份的好方法的另一个好处:关闭从属进程并备份从属。

回答

当我同意innodb的评论时,我将为MyISAM问题提供解决方案。

防止损坏和提高速度的一个好方法是使用MERGE表

我们可以使用2个或者更多MyISAM文件。一种通常用于备份不经常使用的旧数据,另一种是较新的数据。然后,硬盘上将有2个FRM(MyISAM表文件),并且其中1个将受到保护。通常,我们压缩旧的MyISAM表,然后由于它们变为只读状态,因此它们绝对不会损坏。

此技术通常用于加快大型MyISAM表的速度,但是我们也可以在此处应用它。

希望对问题有所帮助。虽然我意识到它并没有真正帮助防撞MyISAM,但是它确实提供了很多保护。