每秒使用哪个引擎进行100多次插入查询

时间:2015-06-23 10:55:44

标签: mysql innodb myisam

每秒使用哪个引擎进行100次以上的插入查询

我阅读了MYISAM和Innodb的不同之处和利弊 但我仍然感到困惑的是一张表中的100多个插入查询(基本上用于跟踪目的)我应该使用哪个db
我提到What's the difference between MyISAM and InnoDB?
根据我的理解,对于每个插入,MYISAM将锁定表格,因此innodb应该用于行锁定 但另一方面,MYISAM的表现要好100倍。

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

2 个答案:

答案 0 :(得分:2)

在任何引擎中,在没有任何调整的情况下执行单行INSERTs的简单代码,每秒大约100行,尤其是InnoDB。

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

InnoDB的快速修复是设置innodb_flush_log_at_trx_commit = 2;这将使用商品旋转磁盘以每秒100次插入停止InnoDB的主要功能。将innodb_buffer_pool_size设置为可用RAM的大约70%也很重要。

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

MyISAM 快100倍;它甚至不是InnoDB的10倍。今天(5.6或更新),你很难找到一个调整得很好的应用程序,它在MyISAM中要快一点。您现在或将来都是I / O限制。

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

ARCHIVE可以节省磁盘空间,但需要花费CPU。

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

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

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

索引:最小化索引数。如果您有随机的'索引,例如UUID,并且你有十亿行,你卡在100行/秒,无论哪个引擎,无论任何调整。我需要进一步解释吗?

如果这是一个排队系统,我说"不要排队,只需这样做。"

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

答案 1 :(得分:0)

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

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

注意插入目标表中的索引。维护索引是服务器插入工作负载的重要组成部分。

不要忘记查看MariaDB。它是MySQL的兼容分支,具有一些更先进的存储引擎和功能。

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

  1. 使用消息排队系统,只运行几个进程来实际执行插入操作。原始客户端将其日志记录写入消息队列而不是直接写入数据库。 (亚马逊AWS的SQS就是这种排队系统的一个例子)。
  2. 重新设计插入过程以使用LOAD DATA INFILE一次加载大量的日志行。
  3. (您可能已经发现这种工作负载在廉价的共享托管服务或AWS微实例上是不可行的。)