每秒超过 100 个插入查询要使用哪个引擎

Which engine to be used for more than 100 insert query per second

每秒超过100个插入查询要使用哪个引擎

我阅读了 MYISAM 和 Innodb 的区别和优缺点。
但我仍然对 table 中的 100 多个插入查询感到困惑(主要用于跟踪目的)我应该使用哪个数据库。

我提到了 What's the difference between MyISAM and InnoDB?
根据我的理解,对于每个插入,MYISAM 都会锁定 table,因此应该使用 innodb 进行行锁定。
但另一方面,MYISAM 的性能要好 100 倍。


那么最佳和正确的选择应该是什么?为什么?

如果您的操作用例是大量插入,MyISAM 是一个更快的选择,您是正确的。但这个答案可能会根据您对数据的使用方式而发生巨大变化。如果这是一个归档应用程序,您可能会考虑 ARCHIVE storage engine。最适合一次写入,很少读取的应用程序。

您应该调查 INSERT DELAYED,因为它将允许您的客户端程序即发即忘这些插入,而不是等待完成。不过,这会在您的 mysqld 进程中消耗 RAM。如果这种操作方式满足您的需求,那么这是使用 MyISAM 的一个令人信服的理由。

注意插入目标 table 中的索引。维护索引是服务器插入工作量的很大一部分。

别忘了查看 MariaDB。它是 MySQL 的兼容分支,具有一些更高级的存储引擎和功能。

我有类似应用程序的经验。在我们的案例中,应用程序的扩展超出了原始插入率,服务器无法跟上。(应用程序工作负载增长总是好的!)我们最终做了两件事,一件接一件。

  1. 使用消息队列系统,运行 只需几个进程即可实际执行插入操作。原始客户端将日志记录写入消息队列而不是直接写入数据库。 (Amazon AWS 的 SQS 就是这种排队系统的一个例子)。
  2. 修改插入过程以使用 LOAD DATA INFILE 一次加载大量日志行。

(您可能已经发现这种工作负载在廉价的共享托管服务或 AWS 微型实例上是不可行的。)

简单的单行代码 INSERTs 在任何引擎中,尤其是 InnoDB 中,没有任何调整的情况下每秒最多可以处理 100 行。

但是,每秒可以获取 1000 行甚至更多。

InnoDB 的快速修复是设置 innodb_flush_log_at_trx_commit = 2;这将打开主要的东西,使用商品旋转磁盘将 InnoDB 停止在 100 inserts/second。将 innodb_buffer_pool_size 设置为可用 RAM 的大约 70% 也很重要。

如果用户同时将多行插入同一个 table,则 LOAD DATA 或 100 行或更多行的批量插入 (INSERT ... VALUES (...), (...), ...) 将插入 倍快。这适用于任何引擎。

MyISAM 不是 的 100 倍;它甚至没有 InnoDB 快 10 倍。今天(5.6 或更新版本),你很难找到一个在 MyISAM 中比速度快一点的调整良好的应用程序。你是,或将是,I/O-limited.

至于损坏 -- 除了在崩溃期间,没有引擎会遭受损坏。电源故障 可能 破坏 MyISAM 索引,通常是可恢复的。此外,批量插入可能会完成一半。 InnoDB 将是干净的——整个批次已完成或 none 已完成;没有腐败。

ARCHIVE 节省磁盘 space,但成本 CPU。

MEMORY 通常更快,因为它没有 I/O。但是你的引擎数据太多了,对吗?

带有 TokuDB 的 MariaDB 可能 运行 比我在这里描述的任何东西都快;但你没有表明需要它。

每秒插入 100 行 = 8M/天 = 3 Billion/year。您最终会清除数据吗?你会查询数据吗?清除:让我们谈谈PARTITION。查询:我们来谈谈汇总表。

索引:尽量减少索引的数量。如果你有一个 'random' 索引,比如 UUID,并且你有十亿行,你 卡在 100 rows/second,无论哪个引擎和无论任何调整。我需要进一步解释吗?

如果这是一个排队系统,我说"Don't queue it, just do it."

底线:使用 InnoDB。调整它。使用批量插入。避免随机索引。等等