5

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

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

如何使 MyISAM 不易因崩溃、不良数据等而损坏?通过检查(CHECK TABLE 或 myisamchk)需要很长时间。

我不是要求事务安全——这就是 InnoDB 的目的。但我确实想要一个可以快速重启的数据库,而不是几小时(或几天!)之后。

更新:我不是在问如何更快地将数据加载到表中。我已经对此表示反对,并确定为我的 LOAD DATA 使用 MyISAM 表要快得多。我现在追求的是降低使用 MyISAM 表的风险。也就是说,减少损坏的机会,提高恢复速度。

4

8 回答 8

3

MyISAM 所谓的速度优势实际上很快就会消失——它缺乏行级锁定这一事实意味着小更新可能导致大量数据被锁定,并且查询被阻塞。正因为如此,我对声称的 MyISAM 速度优势持怀疑态度:开始执行多次更新,每秒的查询量将会下降。

我认为您最好问“如何使 InnoDB 支持的应用程序变得更快?” 然后答案处理缓存数据,也许是在对象级别,在轻量级缓存中 - ACID 是有成本的,对于网络应用程序来说,它并不是真正需要的。

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

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

于 2008-09-16T19:22:54.280 回答
1

While I agree with the innodb comments, I will give a solution to your MyISAM problem.

A good way to prevent corruption and increasing speed would be to use MERGE tables

You can use 2 or more MyISAM files. One is usually for backup'd old data that isn't used that often and the other is newer data. Then you will have 2 FRM (the MyISAM table files) on your harddisk and one will be protected. Usually you compress the old MyISAM tables and then they will defiantly not be corrupted, since they become read-only.

This technique is usually used to speed up big MyISAM tables, but you can apply it here as well.

Hope that helped your question. While I realize it didn't really help crash-proof MyISAM, it does give quite a bit of protection.

于 2008-12-20T01:49:47.837 回答
1

在通常的实践中,你不应该得到腐败。如果您遇到损坏,您需要查看诸如内存损坏、硬盘驱动器损坏、驱动器控制器损坏或可能是 mysql 错误之类的问题。

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

这还有一个额外的好处,那就是实现零停机备份的好方法:关闭从属进程并备份从属进程。

于 2008-12-19T18:41:01.183 回答
1

在某些情况下,MyISAM 的性能优势实际上非常小。您需要对自己的应用程序 MyISAM 与 InnoDB 进行基准测试。专门使用 InnoDB 事务引擎也有其他好处。

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

如果您负担得起,请改用 InnoDB。

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

于 2008-09-16T20:40:35.407 回答
0

你嫁给 MySQL 了吗?Postgres与 ACID 兼容(如 innoDB)并且(在经过良好调整时)几乎与 MyISAM 一样快。

于 2008-09-16T19:15:28.463 回答
0

获得一个良好的 UPS,具有良好的电源调节。在稳定和冗余的硬件上运行。

我不相信 MyISAM 表能够在写入过程中发生崩溃,所以我认为最好的选择是减少崩溃(和写入)的发生。

于 2008-09-18T17:20:44.840 回答
0

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

您可以做的事情是写入表的 InnoDB 副本,然后复制到 MyISAM 副本。无论如何,MyISAM 的性能优势主要是面向读取的。

当然,使用复制,您将在读取和写入之间有延迟时间

于 2008-09-17T12:56:14.827 回答
0

你的评论:

不,主要问题是将数据初始导入表中的磁盘密集型令人吃惊。MyISAM 时间:12 分钟。InnoDB 时间:3+ 小时。在我的初始加载之后,更新不存在,插入也很少见。InnoDB 令人失望的加载操作没有已知的解决方案。

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

于 2008-09-17T12:41:34.003 回答