Laravel中非常慢的雄辩插入/更新查询

时间:2017-06-14 18:58:26

标签: php mysql performance database-performance database-tuning

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

enter image description here

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

  

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

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

我的存储引擎是insert/update

2 个答案:

答案 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