获取为重复键更新多次插入插入的行数

  • 本文关键字:插入 更新 获取 mysql
  • 更新时间 :
  • 英文 :


我有一个非常大的表,主键为 BINARY(20)

该表有大约 1700 万行。每小时,cron 作业都会尝试使用 ON_DUPLICATE_KEY_UPDATE 语法在此表中插入多达 50,000 个新条目。

cronjob 中的每个插入都有 1,000 个值(多次插入)。如何从此查询获取插入到表中的行数?我无法在前后进行行计数,因为大约有 1700 万行,而且查询太昂贵了。

在手动 mysql 中说,对于插入的行,受影响的行数是1的,对于更新的字段,它是2的,这意味着在我的 1000 重复键更新查询中,我可能会影响 1000 - 2000 的行,但我无法知道从这个数字插入了多少条记录?

我怎样才能克服这个问题?

谢谢

插入次数为 2000 减去受影响的行数。更一般地说:

(numberOfValuesInInsert * 2) - mysql_affected_rows()

编辑:

正如Tomas指出的那样,MySQL文档实际上说:

使用 ON 重复键更新时,如果将行作为新行插入,则每行受影响的行值为 1;如果更新现有行,则为

2;如果现有行设置为其当前值,则每行受影响的行值为 0。

[强调我的]

因此,如果可以将现有行设置为相同的值,则无法判断更新了多少行与插入了多少行,因为两个插入与具有不同值的一次更新+具有相同值的一次更新无法区分。

当您的工作执行 1000 的插入时,有些是纯插入,有些是更新,因为您有ON_DUPLICATE_KEY_UPDATE。因此,您可以得到第一个方程

(1) 插入 + 更新 = 插入的行数(在本例中为 1000)

我举一个简单的例子,你得到my_sql_affected_rows的值为 1350。因为对于 插入值 1 和 更新 值 2 聚合到 my_sql_affected_rows .我得到以下等式.

(2) 插入 + 2 * 更新 = my_sql_affected_rows(在本例中为 1350)。

减去 (2) - (1) 。你得到

(3) 更新 = my_sql_affected_rows - 插入的行数

更新 = 1350 - 1000(在本例中为 )。

更新 = 350 .

公式 (1) 中更新的替代值,你得到

插入件 = 650

因此要得到更新的次数,只需要直接使用公式(3)。

最新更新