9

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

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

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

在手册中,mysql说对于插入的行,受影响的行数是1,对于更新的字段2,这意味着在我的 1000 INSERT ON DUPLICATE KEY UPDATE 查询中,我可能会影响 1000 到 2000 的行,但我没有办法告诉从这个数字插入了多少条记录?

我该如何克服呢?

谢谢

4

2 回答 2

10

插入的数量将是 2000 减去受影响的行数。更普遍:

(numberOfValuesInInsert * 2) - mysql_affected_rows()

编辑:

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

使用 ON DUPLICATE KEY UPDATE,如果将行作为新行插入,则每行的受影响行值为 1,如果更新现有行,则为 2,如果将现有行设置为其当前值,则为 0

[强调我的]

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

于 2012-06-07T04:28:48.817 回答
7

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

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

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

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

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

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

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

更新 = 350。

代入等式 (1) 中的 Updates 值,得到

插入 = 650

因此,要获得更新次数,您只需要直接使用等式(3)即可。

于 2012-06-07T06:01:14.930 回答