使用Mysqli查询和REPLACE正确使用TRANSACTION / COMMIT

时间:2016-09-21 08:28:33

标签: php mysql mysqli

我正在创建一个项目,经常需要使用REPLACE INTO从查询语法中在现有的大约110,000,000条记录的INNODB表中每天更新大约300,000个文件。我一直在研究如何更好地优化这一点并找到START TRANSACTION / COMMIT,但我不确定我是否正确行事。它最好只在多个查询中完成吗?目前我正在这样做,并没有看到真正的好处:

$mysqli->query("START TRANSACTION")or die(mysqli_error($mysqli));

$mysqli->query("REPLACE INTO `TABLE1` (field list) SELECT fields FROM `TABLE2`")or die(mysqli_error($mysqli));

$mysqli->query("COMMIT")or die(mysqli_error($mysqli));

2 个答案:

答案 0 :(得分:1)

在事务中包装单个查询没有真正的好处。你可能甚至可以在头上添加几毫秒,但是你插入的数据量不会被注意到。如果您真的担心穿孔,请重新考虑使用REPLACE

  

REPLACE的工作原理与INSERT完全相同,只是如果在一个旧行中   table与PRIMARY KEY或UNIQUE的新行具有相同的值   index,在插入新行之前删除旧行。

在许多情况下,这可能会导致REPLACE操作比INSERT ON DUPLICATE KEY类型查询慢很多。

答案 1 :(得分:0)

是的,对于像这样的查询,性能没有任何好处。

只有在事务中存在大量单独的插入查询时,才会看到性能提升。