mysql - MyISAM 和InnoDB

  显示原文与译文双语对照的内容

我正在研究一个涉及大量数据库写入的项目,我说( 70%插入和 30%读取 ) 。 这个比率还包括我认为是一个读和一个写的更新。 读取可能脏( 例如。 阅读时不需要 100%个准确的信息。
相关任务将在一个小时内完成 1万个数据库事务。

我已经在网上阅读了关于MyISAM和InnoDB之间的区别的一些东西,对于我将在这个任务中使用的特定数据库/表格,MyISAM看起来很明显。 从我看来,如果需要事务,那么如果支持行级别的锁定,InnoDB很好。

对于这种类型的加载( 或者更高) 有什么经验? MyISAM是 go?

时间:

人们经常谈到性能,读取 vs 写入,外键,等等,但在我看来,存储引擎还有另外一个must-have特性: 的原子更新。

尝试这个:

  1. 对需要 5秒的MyISAM表进行更新。
  2. 更新正在进行中,请说 2.5秒,点击Ctrl-C中断它。
  3. 观察对表格的影响。 更新了多少行? 有多少未更新? 表格是可读的,还是在你点击Ctrl-C时被破坏了?
  4. 尝试与一个InnoDB表的更新相同的实验,中断正在进行的查询。
  5. 观察InnoDB表。零行被更新。 InnoDB保证你有原子更新,如果无法提交完整更新,它将回滚整个更改。 此外,该表没有损坏。 即使你使用 killall -9 mysqld 模拟崩溃,这也能奏效。

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

对于更多读写的负载,你将受益于 InnoDB 。 因为InnoDB提供了row-locking而不是 table-locking,你的SELECT 可以是并发的,而不仅仅是彼此的INSERT 。 但是,除非你打算使用SQL事务,否则将InnoDB提交刷新为 2 ( innodb_flush_log_at_trx_commit ) 。 这给了你大量的原始性能,当你将表格从MyISAM移动到InnoDB时,你会丢失这些性能。

另外,考虑添加读取大范围,因为你所列复制。这给你一些你的读取不必是最新的,但是你可以让复制落后一点。 只要确保它能在最繁忙的流量下赶上,否则它将永远落后并且永远不会跟上。 如果你往这边走,然而,我强推荐阅读在从属服务器中你隔离和复制滞后管理到你的数据库处理程序。 如果应用程序代码不知道这一点,那么它就非常简单了。

最后,注意不同的表负载。 对所有表的读取/写入比率都不相同。 一些靠近 100%的较小的表可以保留 MyISAM 。 同样,如果你有一些靠近 100%的表,你可以从 INSERT DELAYED 中获益,但这只在 MyISAM ( DELAYED 表的子句被忽略) 中支持。

但是基准测试要确定。

InnoDB提供:


ACID transactions
row-level locking
foreign key constraints
automatic crash recovery
table compression (read/write)
spatial data types (no spatial indexes)

在InnoDB中,除了文本和BLOB以外的一行中的所有数据最多可以占用 8,000字节。 没有可以用于InnoDB的全文索引。 在InnoDB中,COUNT(*)s (when WHERE, GROUP BY, or JOIN is not used) 执行速度比在MyISAM中慢,因为行计数不是在内部存储的。 InnoDB在一个文件中同时存储数据和索引。 InnoDB使用缓冲池缓存数据和索引。

MyISAM提供:


fast COUNT(*)s (when WHERE, GROUP BY, or JOIN is not used)
full text indexing
smaller disk footprint
very high table compression (read only)
spatial data types and indexes (R-tree)

MyISAM有table-level锁定,但没有row-level锁定。 没有事务。没有自动崩溃恢复,但它提供修复表功能。 没有外键约束。与InnoDB表相比,MyISAM表在磁盘上的大小通常更紧凑。 如果需要,通过使用myisampack压缩,可以进一步减小MyISAM表的大小,但成为 read-only 。 MyISAM将索引存储在一个文件中,数据存储在另一个文件中。 MyISAM使用密钥缓冲区缓存索引,并将数据缓存管理留给操作系统。

总体来说,我推荐使用InnoDB作为大多数用途,而对于专门使用MyISAM则只适用于。 InnoDB现在是新的MySQL版本中的默认引擎。

...