协慌网

登录 贡献 社区

MyISAM 与 InnoDB

我正在研究涉及大量数据库写入的项目,我会说( 70%的插入和 30%的读取 )。该比率还包括我认为是一次读取和一次写入的更新。读取可能很脏(例如,在读取时我不需要 100%准确的信息)。
有问题的任务将是每小时进行超过 100 万次数据库事务。

我在网上看到了一些关于 MyISAM 和 InnoDB 之间差异的东西,对于我将用于此任务的特定数据库 / 表格来说,MyISAM 似乎是我的明显选择。从我似乎正在阅读的内容来看,如果需要事务处理,InnoDB 很好,因为支持行级锁定。

有没有人有这种负载(或更高)的经验? MyISAM 是走的路吗?

答案

我在表格中简要讨论了这个问题,因此您可以得出结论是否与InnoDBMyISAM一起使用。

以下是您应该在哪种情况下使用哪个数据库存储引擎的小概述:

MyISAM   InnoDB
----------------------------------------------------------------
Required full-text search                        Yes      5.6.4
----------------------------------------------------------------
Require transactions                                      Yes
----------------------------------------------------------------
Frequent select queries                          Yes      
----------------------------------------------------------------
Frequent insert, update, delete                           Yes
----------------------------------------------------------------
Row locking (multi processing on single table)            Yes
----------------------------------------------------------------
Relational base design                                    Yes

总结一下:

Frequent reading, almost no writing   => MyISAM
Full-text search in MySQL <= 5.5      => MyISAM

在所有其他情况下, InnoDB通常是最好的方式。

我不是数据库专家,我不会从经验中说话。然而:

MyISAM 表使用表级锁定 。根据您的流量估算值,您每秒接近 200 次写入。使用 MyISAM,其中只有一个可以随时进行 。您必须确保您的硬件能够跟上这些事务以避免被溢出,即单个查询可能不会超过 5 毫秒。

这对我来说,你需要一个支持行级锁定的存储引擎,即 InnoDB。

另一方面,编写一些简单的脚本来模拟每个存储引擎的负载应该是相当简单的,然后比较结果。

人们经常谈论性能,读取与写入,外键等等,但在我看来,存储引擎还有另外一个必备功能: 原子更新。

试试这个:

  1. 针对 MyISAM 表发出 UPDATE 需要 5 秒钟。
  2. 当 UPDATE 正在进行时,比如 2.5 秒,按 Ctrl-C 中断它。
  3. 观察桌子上的效果。更新了多少行?有多少人没有更新?表格是否可读,或者在按下 Ctrl-C 时是否已损坏?
  4. 针对 InnoDB 表尝试使用 UPDATE 进行相同的实验,中断正在进行的查询。
  5. 观察 InnoDB 表。 行已更新。 InnoDB 已经确保您有原子更新,如果无法提交完整更新,它会回滚整个更改。此外,该表没有损坏。即使您使用killall -9 mysqld来模拟崩溃,这仍然有效。

当然,性能是可取的,但不要丢失数据应该胜过它。