mysql – MyISAM与InnoDB

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

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

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


答案

我在表格中简要地讨论过这个问题,这样你就可以得出结论是否与InnoDBMyISAM一起使用。

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

                                                 MyISAM InnoDB
-------------------------------------------------- --------------
必需的全文搜索是5.6.4
-------------------------------------------------- --------------
需要交易是的
-------------------------------------------------- --------------
经常选择查询是      
-------------------------------------------------- --------------
频繁插入,更新,删除是
-------------------------------------------------- --------------
行锁定(单表上的多处理)是
-------------------------------------------------- --------------
关系基础设计是的

总结一下:

经常阅读,几乎没有写作=> MyISAM
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模拟崩溃,这也有效。

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


我使用MySQL工作的大容量系统,我已经尝试了MyISAM和InnoDB。

我发现MyISAM中的表级锁定导致了我们工作负载的严重性能问题,这听起来与您的相似。不幸的是,我还发现InnoDB下的表现也比我希望的要糟糕。

最后,我通过对数据进行分段来解决争用问题,使得插入进入“热”表并选择从不查询热表。

这也允许删除(数据是时间敏感的,我们只保留X天价值)发生在“陈旧”表上,这些表再次未被选择查询触及。InnoDB似乎在批量删除方面表现不佳,因此如果您计划清除数据,您可能希望以旧数据处于陈旧表中的方式对其进行构造,这样可以简单地删除而不是在其上运行删除。

当然我不知道你的应用程序是什么,但希望这能让你深入了解MyISAM和InnoDB的一些问题。


游戏有点晚……但这是几个月前写的一篇相当全面的文章,详细介绍了MYISAM和InnoDB之间的主要区别。拿一杯茶(也许是一块饼干),享受吧。


MyISAM和InnoDB之间的主要区别在于引用完整性和事务。还有其他差异,例如锁定,回滚和全文搜索。

参照完整性

参照完整性可确保表之间的关系保持一致。更具体地说,这意味着当表(例如,列表)具有指向不同表(例如,产品)的外键(例如,产品ID)时,当指向的表发生更新或删除时,这些更改被级联到链接表。在我们的示例中,如果重命名产品,链接表的外键也将更新; 如果从“产品”表中删除产品,则任何指向已删除条目的列表也将被删除。此外,任何新的列表必须具有指向有效的现有条目的外键。

InnoDB是一个关系型DBMS(RDBMS),因此具有参照完整性,而MyISAM则没有。

交易与原子性

表中的数据使用数据操作语言(DML)语句进行管理,例如SELECT,INSERT,UPDATE和DELETE。一个事务组将两个或多个DML语句一起组成一个单独的工作单元,因此要么应用整个单元,要么都不应用。

MyISAM不支持InnoDB的交易。

如果在使用MyISAM表时操作被中断,则操作立即中止,受影响的行(甚至每行中的数据)仍会受到影响,即使操作未完成也是如此。

如果在使用InnoDB表时操作被中断,因为它使用具有原子性的事务,任何未完成的事务都不会生效,因为没有提交。

表锁定与行锁定

当查询针对MyISAM表运行时,它将查询的整个表将被锁定。这意味着后续查询只会在当前查询完成后执行。如果您正在阅读大型表,和/或频繁的读写操作,这可能意味着大量的查询积压。

当查询针对InnoDB表运行时,仅锁定所涉及的行,表的其余部分仍然可用于CRUD操作。这意味着查询可以在同一个表上同时运行,前提是它们不使用同一行。

InnoDB中的此功能称为并发。与并发性一样,存在一个主要的缺点,适用于选择范围的表,因为在内核线程之间切换存在开销,您应该对内核线程设置限制以防止服务器停止。

交易和回滚

在MyISAM中运行操作时,将设置更改; 在InnoDB中,可以回滚这些更改。用于控制事务的最常用命令是COMMIT,ROLLBACK和SAVEPOINT。1. COMMIT – 您可以编写多个DML操作,但只有在发出COMMIT时才会保存更改2. ROLLBACK – 您可以放弃尚未提交的任何操作3. SAVEPOINT – 在列表中设置一个点ROLLBACK操作可以回滚到的操作

可靠性

MyISAM不提供数据完整性 – 硬件故障,不干净的关闭和取消的操作可能导致数据损坏。这将需要完整修复或重建索引和表。

另一方面,InnoDB使用事务日志,双写缓冲区以及自动校验和验证来防止损坏。在InnoDB进行任何更改之前,它会将事务之前的数据记录到名为ibdata1的系统表空间文件中。如果发生崩溃,InnoDB将通过重播这些日志进行自动恢复。

FULLTEXT索引

在MySQL 5.6.4版之前,InnoDB不支持FULLTEXT索引。截至本文撰写时,许多共享主机提供商的MySQL版本仍然低于5.6.4,这意味着InnoDB表不支持FULLTEXT索引。

但是,这不是使用MyISAM的正当理由。最好转换为支持最新MySQL版本的托管服务提供商。并非使用FULLTEXT索引的MyISAM表无法转换为InnoDB表。

结论

总之,InnoDB应该是您选择的默认存储引擎。在满足特定需求时选择MyISAM或其他数据类型。

添加评论

友情链接:蝴蝶教程