5

我们对单个 MySQL 表(存储用户活动信息)进行了持续的简单更新。假设我们每秒将它们分组为批量更新。

我想大致了解一下典型的 4 核 8GB 机器上的 mysql 何时会开始出现跟不上每秒更新的问题。例如,我每秒可以进行多少行更新@ 1?

这是一个思考练习,以决定我是否应该在我们的应用程序发布的早期开始使用 MySQL(简化开发),或者 MySQL 是否可能很快就会爆炸,以至于它甚至不值得冒险走这条路。

4

3 回答 3

7

获得体面数字的唯一方法是对特定用例进行基准测试。变量太多了,没有办法解决。

如果您只是敲击一个 bash 脚本或一个小型演示应用程序并使用jmeter敲击它,那么它应该不会花费太长时间,那么这会给您一个好主意。

在尝试对类似用例进行基准测试时,我使用了 jmeter。不同之处在于我正在寻找INSERTS. 我玩的时候最有用的是'innodb_flush_log_at_trx_commit'参数。如果您正在使用INNODB并且不需要为您的用例提供 ACID 合规性,则将其更改为 0。这会对INSERT吞吐量产生巨大影响,并且可能会在您的UPDATE用例中做同样的事情。尽管请注意,使用此设置,更改只会每秒刷新一次磁盘,因此如果您的服务器断电或发生其他情况,您可能会丢失一秒钟的数据。

在我的四核 8GB 机器上用于我的用例:

  • innodb_flush_log_at_trx_commit=1导致每秒 80 次插入
  • innodb_flush_log_at_trx_commit=0导致每秒 2000 次插入

这些数字可能与您的用例无关 - 这就是您需要自己对其进行基准测试的原因。

于 2012-10-11T11:53:47.127 回答
2

对这个问题给出一个一般性的答案并不容易。您要求的数字不仅在很大程度上取决于您的数据库服务器的硬件、MySQL 本身,而且还取决于服务器/客户端配置、网络以及 - 同样重要的是 - 还取决于您的数据库/表设计。

一般来说,在最先进的服务器上设置裸 MySQL 并使用唯一键更新语句,如果我从 200 秒以下更新语句,我不会遇到问题localhost,至少这是我得到的在我六岁的 winxp 测试环境中。新系统上的裸机安装将以这种方式扩展得更高。如果您认为更大,那么一台服务器不是要走的路。MySQL 可以通过某些方式进行调整扩展,因此许多公司严重依赖它。

只是一些基础知识:

  • 如果要更新的字段有巨大的索引文件,更新语句会慢很多,因为每个语句不仅要写入数据,还要写入索引信息。
  • 如果您的更新语句不能使用索引,则服务器可能需要更长的时间来分配它必须更新的必填字段。
  • 慢速内存和/或慢速硬盘也可能会降低整体服务器性能。
  • 缓慢的网络连接会减慢客户端和服务器之间的通信速度。

有整本书都写过,所以我会在这里停下来,建议你进一步阅读,如果你有兴趣!

于 2012-10-11T11:49:55.287 回答
2

这在很大程度上取决于您用来推送到数据库的代码的质量。

如果您编写批处理以在每个请求中插入一个值INSERT(即,

INSERT INTO table (field) VALUES (value_1);
INSERT INTO table (field) VALUES (value_2);
...
INSERT INTO table (field) VALUES (value_n);

,你的表演会崩溃和燃烧。

如果您使用单个值插入多个值INSERT(即

INSERT INTO table (field) values (value_1),(value_2)...(value_n);

,你会发现你可以很容易地每秒插入很多条记录

例如,我编写了一个快速应用程序,该应用程序需要将 LDAP 帐户请求的详细信息添加到持有数据库。一次插入一个字段(即LDAP_field, LDAP_value),整个脚本的执行需要 10 秒。当我将这些值连接到单个 INSERT 请求中时,脚本的执行时间从开始到结束下降到大约 2 秒。这包括启动和提交事务的开销

希望这可以帮助

于 2012-10-11T11:50:54.960 回答