获取ON DUPLICATE KEY UPDATE多次插入时插入的行数?

Gri*_*iff 9 mysql

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

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

cronjob中的每个插入都有1,000个值(多个插入).如何从此查询中获取插入表中的行数?我之前和之后都不能进行行计数,因为有大约1700万行并且查询太贵了.

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

我怎么能克服这个?

谢谢

Pau*_*ora 11

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

(numberOfValuesInInsert * 2) - mysql_affected_rows()
Run Code Online (Sandbox Code Playgroud)

编辑:

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

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

[强调我的]

因此,如果将现有行设置为相同的值是可能的,则无法确定更新与插入的行数,因为两个插入与一个具有不同值的更新无法区分+一个具有相同值的更新.


pay*_*ans 8

当您的作业执行Insert of 1000时,一些是纯插入,一些是更新,因为您有ON_DUPLICATE_KEY_UPDATE.因此,您得到了第一个等式

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

我举一个简单的例子,你得到my_sql_affected_rows的值为1350.因为对于Insert值为1并且为了更新值2为聚合到my_sql_affected_rows.我得到以下等式.

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

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

(3)Updates = my_sql_affected_rows - 没有插入行

更新= 1350 - 1000(在此示例中).

更新= 350.

你得到了等式(1)中的更新的替代值

插入= 650

因此,要获得更新的数量,您只需要直接使用等式(3).

  • 公式 (1) 在这里并不准确,因为如果将一行设置为其当前值,我们会得到 0。因此您会得到: (1) 插入 + 更新 + 未更改 = 插入的行数。这给出了 3 个变量,使得这个问题无法解决:/ (2认同)