3

我有一个 laravel 应用程序,它必须insert/update在 for 循环中每秒记录数千条记录。我的问题是我的数据库insert/update速率是每秒100-150次写入。我增加了专用于我的数据库的RAM量,但没有运气。

在此处输入图像描述

有什么办法可以将mysql的写入速率提高到每秒数千条记录?

请为我提供性能调整的最佳配置

并且不要标记问题。我的代码是正确的。它不是代码问题,因为我对MONGODB没有任何问题。但我必须使用 mysql 。

我的存储引擎是InnoDB

4

2 回答 2

3

一次插入一行,并自动提交每个语句,有两个开销。

每个事务都有开销,可能不止一个插入。所以在一个事务中插入多行是诀窍。这需要更改代码,而不是更改配置

每个INSERT 语句都有开销。一个刀片有大约 90% 的顶部和 10% 的实际刀片。

最佳的是每个事务插入100-1000

对于快速插入:

  • 最好是LOAD DATA- 如果您从 .csv 文件开始。如果您必须首先构建 .csv 文件,那么这种开销是否会导致这种方法失败是值得商榷的。
  • 第二好的是多行INSERT语句: INSERT INTO t (a,b) VALUES (1,2), (2,3), (44,55), .... 我建议每条语句和COMMIT每条语句 1000 条。这可能会让您每秒插入超过 1000行。

另一个问题...由于每个索引都会随着行的插入而更新,因此您可能会遇到通过颠簸 I/O 来完成此任务的麻烦。InnoDB 自动“延迟”对非唯一二级索引的更新(不需要INSERT DELAYED),但工作最终完成。(所以 RAM 大小并innodb_buffer_pool_size开始发挥作用。)

如果“数千”行/秒是一次性任务,那么您可以在此处停止阅读。如果您希望“永远”不断地这样做,那么还有其他问题需要解决。请参阅高速摄取

于 2017-06-29T03:17:22.753 回答
2

对于插入,您可能需要查看INSERT DELAYED语法。这将提高插入性能,但对更新没有帮助,语法最终将被弃用。这篇文章提供了更新的替代方案,但它涉及自定义复制。

我公司成功加快插入速度的一种方法是将 SQL 写入文件,然后使用 MySQLLOAD DATA INFILE命令进行操作,但我相信我们发现需要服务器的命令行才能mysql安装应用程序。

我还发现批量插入和更新通常更快。因此,如果您要调用INSERT2k 次,则最好运行 10 次插入,每次插入 200 行。这将减少锁定要求并减少通过线路发送的信息/呼叫数量。

于 2017-06-14T20:36:57.367 回答