MySQL:使用插入和更新而不是插入重复键更新是否更快?

标签 mysql performance

我有一个更新数据库中大量行的 cron 作业。有些行是新的,因此插入,有些是现有行的更新,因此更新。

我在整个数据的重复键更新上使用插入并在一次调用中完成。

但是-我实际上知道哪些行是新的,哪些是更新的,所以我也可以分别进行插入和更新。

将插入和更新分开在性能方面有优势吗?这背后的机制是什么?

谢谢!

最佳答案

在我的测试中,使用 ON DUPLICATE KEY UPDATE 比使用 Insert/Update 平均慢 1.3 倍。 这是我的测试:

插入/更新(54.07 秒)

    <?php 
       $mtime = microtime(); 
       $mtime = explode(" ",$mtime); 
       $mtime = $mtime[1] + $mtime[0]; 
       $starttime = $mtime; 
    ?> 
    <?php
    set_time_limit(0);
    $con = mysql_connect('localhost', 'root', '');
    mysql_select_db('test');

    for ($i = 1; $i <= 1000; $i = $i + 2)
    {
        mysql_query("
                    INSERT INTO users
                    VALUES(NULL, 'username{$i}', 'email.{$i}', 'password{$i}')
                    ");
    }

    for ($i = 1; $i <= 1000; $i++)
    {
        if ($i % 2 == 0)
        {
            mysql_query("
                    INSERT INTO users
                    VALUES(NULL, 'username{$i}', 'email.{$i}', 'password{$i}')
                    ");
        }
        else
        {
             mysql_query("
                        UPDATE users
                        SET (username = 'username{$i}', email = 'email{$i}', password = 'password{$i}')
                        ");
        }
    }
    ?>
    <?php 
       $mtime = microtime(); 
       $mtime = explode(" ",$mtime); 
       $mtime = $mtime[1] + $mtime[0]; 
       $endtime = $mtime; 
       $totaltime = ($endtime - $starttime); 
       echo "This page was created in ".$totaltime." seconds"; 
    ?>

重复 key 更新(70.4 秒)

<?php 
   $mtime = microtime(); 
   $mtime = explode(" ",$mtime); 
   $mtime = $mtime[1] + $mtime[0]; 
   $starttime = $mtime; 
?> 
<?php
set_time_limit(0);
$con = mysql_connect('localhost', 'root', '');
mysql_select_db('test');

for ($i = 1; $i <= 1000; $i = $i + 2)
{
    mysql_query("
                INSERT INTO users
                VALUES(NULL, 'username{$i}', 'email.{$i}', 'password{$i}')
                ");
}

for ($i = 1; $i <= 1000; $i++)
{
    mysql_query("
                INSERT INTO users
                VALUES({$i}, 'username{$i}', 'email.{$i}', 'password{$i}')
                ON DUPLICATE KEY UPDATE
                username = 'username{$i}', email = 'email{$i}', password = 'password{$i}'
                ");    
}
?>
<?php 
   $mtime = microtime(); 
   $mtime = explode(" ",$mtime); 
   $mtime = $mtime[1] + $mtime[0]; 
   $endtime = $mtime; 
   $totaltime = ($endtime - $starttime); 
   echo "This page was created in ".$totaltime." seconds"; 
?>

关于MySQL:使用插入和更新而不是插入重复键更新是否更快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2495958/

相关文章:

mysql - 使用 CFTRANSACTION 的多个数据源

PHP 不回显最后一行的文本

java - 海量 MySQL 更新

c# - null 或空检查的代码优化

performance - 系统/操作系统缓存与应用程序缓存

php - 数组的额外 2 个随机部分

mysql - 保留行,即使它们在其他连接表 MySQL 查询中没有任何行

php - MySQL 中 DELETING 和 INSERTING 时出现重复键错误

performance - 如何测量 Excel 计算时间

javascript - 何时分离文件以节省带宽