【问题标题】:Mysql Table Insert PerformanceMysql 表插入性能
【发布时间】:2016-12-10 22:26:59
【问题描述】:

我有以下架构的表:http://i.imgur.com/jn2nrFT.png

它的 MySQL,在 InnoDB 上运行,在基本的 Digital Ocean 主机(512 MB,1 CPU)上。我正在使用 PHP/Doctrine,在我的代码中,我做了类似的事情

for( $i = 0; $i < 5000; ++$i ) {
    $row = findRowInTable();
    if (! $row ) {
        insertNewRow();
    }
}
$em->flush();

它很慢,当表为空时需要 20 秒,当表有 5000 行时需要 50 秒。

如何优化它?我将添加最多 5K 行,但我需要在 120 秒内完成此过程,即使表的长度为 200K 行

【问题讨论】:

  • 要表演,不要学说。
  • 并获得更多内存。另一个cpu也会很好。另外,我们不知道您是否没有在同一个循环中打开/关闭数据库连接和/或在那里查询与数据库相关的内容。
  • @JayBlanchard 泰坦尼克号很久以前沉没了 ;-) 快艇的时间到了!有 2 个 454 和 8 个枪管,或者更好,blower! 在 2 个 426 HEMI 上。
  • 我对 Doctrine 不熟悉,但是寻找一种方法来做INSERT IGNORE,而不是先寻找行,并找到一种批量插入的方法。
  • 如果你想要速度,不要使用PHP,让mysql处理它

标签: php mysql optimization doctrine innodb


【解决方案1】:

您可以尝试在循环之外查找不在数据库中的行,尝试使用单个查询查找行,然后让 php 迭代。

$rowsARR = findRowsNotInTable();
for( $i = 0; $i < sizeof($rowsARR); ++$i ) {
       insertTheRow($rowsARR[i]);
}
$em->flush();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-12-01
    • 2014-11-24
    • 2011-12-20
    • 2013-08-02
    • 1970-01-01
    • 1970-01-01
    • 2012-02-09
    • 1970-01-01
    相关资源
    最近更新 更多