7

我有一个问题:我用 Yii 和 InnoDB 构建了一个大型应用程序并遇到了问题,插入/更新持续时间真的很长,这是我的 php 报告:

INNODB:管理员用户更新 55.247464895248 秒 ekuskov 用户更新 13.282548904419 秒 doriwall 用户更新 0.002094030380249 秒

MYISAM:管理员用户更新 7.8317859172821 秒 ekuskov 用户更新 1.6304929256439 秒 doriwall 用户更新 0.0020859241485596 秒

谁能提出一些解决方案来加快插入/更新?

编辑 - - - - - - - - - - - - - - - - - - - - - - -

现在我使用了一些非常简单的插入循环:

public function run($args) {
    $time = -microtime(true);

    $begin    = DateTime::createFromFormat('Y-m-d H:i:s', '2010-01-01 00:00:00');
    $end    = DateTime::createFromFormat('Y-m-d H:i:s', '2013-01-01 00:00:00');
    $end->add(new DateInterval('P1D'));
    $interval = DateInterval::createFromDateString('1 day');
    $days     = new DatePeriod($begin, $interval, $end);


    foreach ( $days as $day ) {
        echo "i";
        $track = new TimeTracking();
        $track->user_id = 25;
        $track->date = $day->format('Y-m-d H:i:s');
        $track->active = 4;
        $track->save(false);
    }

    $time += microtime(true);
    echo count($days)." items insert - $time seconds\n";
}

现在插入时间如下:

InnoDB:项目插入 - 72.269570827484 秒

MyISAM:项目插入 - 0.87537479400635 秒

[编辑]现在我正在计算整个 SAVE 方法和 Yii 模型“save()”函数的时间:

更新:模型->保存(假)- 0.1096498966217 秒

更新:控制器保存功能 () - 0.1302649974823 秒

创建:模型->保存(假)- 0.052282094955444 秒

CREATE:控制器保存函数 () - 0.057214975357056 秒

为什么只是 save() 方法需要这么长时间?

[编辑]我已经测试了 save() 与 command() 并且它们的持续时间相同:

$track->save(false);

或者

$command = Yii::app()->db->createCommand();
            $command->insert('timeTracking', array(
                    'id'=>NULL,
                    'date'=>$track->date,
                    'active'=>$track->active,
                    'user_id'=>$track->user_id,
            ));

编辑------------------

这是插入 1,097 个对象的统计数据:

save(): 0.86-0.94, 
$command->insert(): 0.67-0.72,
$command->execute(): 0.46-0.48,
mysql_query(): 0.33-0.36

最后回答:如果你想使用一些大规模的 INSERT 或 UPDATE 方法,你应该考虑使用直接 MYSQL 调用来创建函数,在那里你将节省近 70% 的执行时间。

问候,

埃德加

4

6 回答 6

1

在插入和更新时爬行的表可能表明您对索引有点忘乎所以。请记住,数据库必须在每次提交后停止并重新编译索引。

于 2013-09-24T15:46:15.553 回答
0

InnoDB 在许多方面都比 MyISAM 复杂得多,功能丰富的引擎。这使它变慢了,并且您在查询、配置或其他方面无能为力来解决这个问题。然而,MySQL 正试图通过最近的更新来缩小差距。

看5.6版:

http://dev.mysql.com/doc/refman/5.6/en/innodb-performance.html

如果你落后了,你最好的选择可能是升级你的 MySQL 版本。

于 2013-07-10T20:21:39.797 回答
0

正如 MySQL 专家所说,在您可以明确证明您需要 MyISAM 之前,请使用 InnoDB。性能问题不是很好的论据。

如果您有大型应用程序,您可能会面临表级锁和数据不一致的问题。所以使用 InnoDB

您的性能问题可能与缺少索引或硬盘及其文件系统问题有关。

我使用的表具有数亿行,这些行从多个连接中不断更新和插入。这些表有 InnoDB 引擎。

当然,如果您有应该成堆添加的数据,请使用一个插入语句添加它们。

于 2014-04-28T07:14:50.407 回答
0

InnoDB 提供了创建关系和约束的选项,这使数据库更快,您将能够使用这些关系生成模型和 crud。

您还可以考虑将查询分解为较小的查询并一一执行。

于 2014-03-21T13:38:27.117 回答
0

使用 Yii 和 InnoDB 您应该将命令包装在事务中,如下所示:

$transaction = Yii::app()->db->beginTransaction();

try {
    // TODO Loop through all of your inserts

    $transaction->commit();
} catch (Exception $ex) {
    // There was some type of error. Rollback the last transaction
    $transaction->rollback();
}
于 2013-04-05T22:12:01.633 回答
0

解决方案是:对于那些需要大量插入和快速响应的表,将它们转换为 MyISAM。否则用户必须等待很长时间并且存在威胁,PHP Max Script Execution Time 将停止您的脚本。

于 2013-04-19T08:57:00.420 回答