我有一个laravel应用程序,在for循环中每秒必须3
4
5
千条记录。我的问题是我的数据库insert/update
速率 100-150 每秒写入。我增加了专用于我的数据库的 RAM 的数量,但没有运气。
有没有办法将 mysql 的写入速率提高到每秒数千条记录?
请为我提供性能调整的最佳配置
和请不要记下问题。我的代码是正确的。这不是代码问题,因为我对 MONGODB 没有任何问题。但我必须使用mysql。
我的存储引擎是insert/update
答案 0 :(得分:2)
对于insert,您可能需要查看INSERT DELAYED
语法。这将提高插入性能,但它无助于更新,语法最终将被弃用。 This post提供了更新的替代方案,但它涉及自定义复制。
我公司成功加速插入的一种方法是将SQL写入文件,然后使用MySQL LOAD DATA INFILE
命令,但我相信我们发现需要服务器的命令行才能拥有{{ 1}}已安装应用程序。
我还发现批量插入和更新通常更快。因此,如果您正在调用mysql
2k次,那么最好每次运行10个200行的插入。这会降低锁定要求并减少通过线路发送的呼叫的信息/数量。
答案 1 :(得分:1)
一次插入一行,并自动提交每个语句,有两个开销。
每个事务都有开销,可能不止一个插入。因此,在一个事务中插入多行是诀窍。这需要代码更改,而不是配置更改。
每个INSERT
语句都有开销。一个刀片具有大约90%的头部和10%的实际刀片。
每个事务插入的最佳值为100-1000 行。
快速插入:
LOAD DATA
- 如果你开始使用.csv文件。如果你必须首先构建.csv文件,那么开销是否会使这种方法失败是值得商榷的。INSERT
语句:INSERT INTO t (a,b) VALUES (1,2), (2,3), (44,55), ...
。我推荐每个语句1000个,每个语句COMMIT
。这可能会让您每秒插入超过1000行行。另一个问题...由于每个索引都会在插入行时更新,因此可能在执行此任务时遇到麻烦。 InnoDB自动"延迟"更新到非唯一的二级索引(不需要INSERT DELAYED
),但最终完成了工作。 (因此RAM大小和innodb_buffer_pool_size
起作用。)
如果"千"行/秒是一次性任务,那么你可以在这里停止阅读。如果您希望不断地“永远”这样做,还有其他问题需要解决。请参阅High speed ingestion。