我有一个 laravel 应用程序,它必须insert/update
在 for 循环中每秒记录数千条记录。我的问题是我的数据库insert/update
速率是每秒100-150次写入。我增加了专用于我的数据库的RAM量,但没有运气。
有什么办法可以将mysql的写入速率提高到每秒数千条记录?
请为我提供性能调整的最佳配置
并且请不要标记问题。我的代码是正确的。它不是代码问题,因为我对MONGODB没有任何问题。但我必须使用 mysql 。
我的存储引擎是InnoDB
我有一个 laravel 应用程序,它必须insert/update
在 for 循环中每秒记录数千条记录。我的问题是我的数据库insert/update
速率是每秒100-150次写入。我增加了专用于我的数据库的RAM量,但没有运气。
有什么办法可以将mysql的写入速率提高到每秒数千条记录?
请为我提供性能调整的最佳配置
并且请不要标记问题。我的代码是正确的。它不是代码问题,因为我对MONGODB没有任何问题。但我必须使用 mysql 。
我的存储引擎是InnoDB
一次插入一行,并自动提交每个语句,有两个开销。
每个事务都有开销,可能不止一个插入。所以在一个事务中插入多行是诀窍。这需要更改代码,而不是更改配置。
每个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
开始发挥作用。)
如果“数千”行/秒是一次性任务,那么您可以在此处停止阅读。如果您希望“永远”不断地这样做,那么还有其他问题需要解决。请参阅高速摄取。
对于插入,您可能需要查看INSERT DELAYED
语法。这将提高插入性能,但对更新没有帮助,语法最终将被弃用。这篇文章提供了更新的替代方案,但它涉及自定义复制。
我公司成功加快插入速度的一种方法是将 SQL 写入文件,然后使用 MySQLLOAD DATA INFILE
命令进行操作,但我相信我们发现需要服务器的命令行才能mysql
安装应用程序。
我还发现批量插入和更新通常更快。因此,如果您要调用INSERT
2k 次,则最好运行 10 次插入,每次插入 200 行。这将减少锁定要求并减少通过线路发送的信息/呼叫数量。