我可以合理预期每秒向 MySQL 服务器写入多少次?

use*_*560 9 mysql performance

我们正在运行自定义广告服务器解决方案,在某些情况下,我们会在 MySQL 中存储和递增/递减计数和聚合值,以进行优化。

我知道在 MySQL 中进行计数并不理想,尽管我不能 100% 确定原因。我的猜测是,写入磁盘比写入内存慢,因此在 Redis 中保存计数比在 MySQL 中保存计数效果更好。但这会给我们的系统增加一些额外的复杂性,并且意味着对多个组件进行重大更改。

过去,我们看到连接计数不断增加,CPU 利用率不断上升,但在缓存大部分请求并切换到更快的磁盘后,我们成功提高了这一限制。目前,我们每天使用主从 MySQL 配置处理 10-2000 万个请求,其中写入发送到主服务器,大部分读取从从服务器完成。另外,添加另一个从服务器根本不是问题。

我关心的是 master 上的写入,尽管它们只是在 5 个表中每一个中增加一行的微小操作。

所以我的问题是:根据您的经验,在达到限制之前,我每秒可以在 MySQL 中安全执行多少次这样的小写入?我听说人们同时处理 100k 个连接,但是如果所有这些连接都尝试在同一秒内增加一行怎么办?在需要时扩大规模的好策略是什么?

谢谢!

Ric*_*mes 12

对于 InnoDB,您可能会同意 SSD。

UPDATEs每天20M = 230/秒;如果有尖峰则更多。

旋转磁盘 (HDD):每秒 100 次写入。

SSD:也许 1000/秒。

批量INSERTs运行速度更快。

某些 RAID 变体运行速度更快。

具有电池支持写入缓存的 RAID 控制器运行速度非常快(对于写入)(直到缓存饱和)。

为了保留“喜欢”或“查看”或“点击”,最好将计数器与有关页面/产品/其他内容的其余列保存在单独的表中。这样,更新计数器和处理其他数据的干扰就会减少。

有几个设置需要考虑调整:

innodb_flush_log_at_trx_commit = 2 (权衡速度而不是安全)

sync_binlog = OFF

将多个操作合并到一个BEGIN..COMMIT事务中。但要小心死锁等问题。

也许你说的不是100K连接?这是一个巨大的数字。超过几十个正在运行的线程(不管休眠线程的数量)是相当多的。

另一种计算点击次数的方法不是实时记录点击次数,而是每隔(比如每小时)抓取一次网络服务器日志。有一个单独的过程来将一小时(或每 5 分钟或其他)的所有点击计数为一个数字,以提供给UPDATE. 对于单独的服务器来说,这将需要更多的工作,但对于数据库来说,工作量却很小。

  • @broofa - 不是真的;主要来自 20 年的 MySQL 经验。我的网站有各种类似这样的东西的汇编:http://mysql.rjweb.org/ (2认同)