我们对单个 MySQL 表(存储用户活动信息)进行了持续的简单更新。假设我们每秒将它们分组为批量更新。
我想大致了解一下典型的 4 核 8GB 机器上的 mysql 何时会开始出现跟不上每秒更新的问题。例如,我每秒可以进行多少行更新@ 1?
这是一个思考练习,以决定我是否应该在我们的应用程序发布的早期开始使用 MySQL(简化开发),或者 MySQL 是否可能很快就会爆炸,以至于它甚至不值得冒险走这条路。
我们对单个 MySQL 表(存储用户活动信息)进行了持续的简单更新。假设我们每秒将它们分组为批量更新。
我想大致了解一下典型的 4 核 8GB 机器上的 mysql 何时会开始出现跟不上每秒更新的问题。例如,我每秒可以进行多少行更新@ 1?
这是一个思考练习,以决定我是否应该在我们的应用程序发布的早期开始使用 MySQL(简化开发),或者 MySQL 是否可能很快就会爆炸,以至于它甚至不值得冒险走这条路。
获得体面数字的唯一方法是对特定用例进行基准测试。变量太多了,没有办法解决。
如果您只是敲击一个 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 次插入这些数字可能与您的用例无关 - 这就是您需要自己对其进行基准测试的原因。
对这个问题给出一个一般性的答案并不容易。您要求的数字不仅在很大程度上取决于您的数据库服务器的硬件、MySQL 本身,而且还取决于服务器/客户端配置、网络以及 - 同样重要的是 - 还取决于您的数据库/表设计。
一般来说,在最先进的服务器上设置裸 MySQL 并使用唯一键更新语句,如果我从 200 秒以下更新语句,我不会遇到问题localhost
,至少这是我得到的在我六岁的 winxp 测试环境中。新系统上的裸机安装将以这种方式扩展得更高。如果您认为更大,那么一台服务器不是要走的路。MySQL 可以通过某些方式进行调整和扩展,因此许多公司严重依赖它。
只是一些基础知识:
有整本书都写过,所以我会在这里停下来,建议你进一步阅读,如果你有兴趣!
这在很大程度上取决于您用来推送到数据库的代码的质量。
如果您编写批处理以在每个请求中插入一个值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 秒。这包括启动和提交事务的开销
希望这可以帮助