优化多个数据库更新

时间:2017-05-14 00:21:09

标签: mysql sql performance laravel

我在我的应用程序中使用laravel。 所以现在我需要每天使用Cron作业更新DB上的许多行。

如果我将使用更新选项内置laravel我需要做这样的事情:

// for example, the update info in array
$arrayToUpadte = [
    [
        'numberId' => '0500000000',
        'usagePer' => '4.5'
    ],
    [
        'numberId' => '0500000001',
        'usagePer' => '5.6'
    ],
    [
        'numberId' => '0500000002',
        'usagePer' => '8.1'
    ],
    [
        'numberId' => '0500000003',
        'usagePer' => '0.3'
    ]   
];


// update will do one query to db every update!!
foreach( $arrayToUpadte as $updates ){

    \App\Phonelines::where( 'numberId', '=', $updates['numberId'] )->update([
        'usagePer' => $updates['usagePer']
    ]);

}

所以我的问题是如何改进代码以尽量减少查询?

如果我在常规PHP项目中有这个,我会这样做:

$newValues = [];
foreach( $arrayToUpadte as $updates ){
    $newValues[] = $updates['numberId'] . ',' . $updates['usagePer'];
}

$newValues = implode( '),(', $newValues );

$mysqli -> query( "
    INSERT INTO `phonelines` ( `numberId`, `usagePer` ) VALUES (" . $newValues . ")
    ON DUPLICATE KEY
    UPDATE `usagePer` = VALUES( `usagePer` );
" );

在Laravel的框架中有没有办法做到这一点?

1 个答案:

答案 0 :(得分:1)

你可以用这个:

  DB::raw("INSERT INTO `phonelines` ( `numberId`, `usagePer` ) 
              VALUES (" . $newValues . ") ON DUPLICATE KEY
             UPDATE `usagePer` = VALUES( `usagePer` )") ;