我有一个非常大的表,主键为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,但我无法知道从这个数字中插入了多少条记录?
我怎样才能克服这个?
由于
答案 0 :(得分:11)
插入数量为2000减去受影响的行数。更一般地说:
(numberOfValuesInInsert * 2) - mysql_affected_rows()
修改强>
作为tomas points out,MySQL docs实际上说:
使用ON DUPLICATE KEY UPDATE,如果将行作为新行插入,则每行的受影响行值为1;如果现有行更新,则为每行,如果现有行设置为当前行,则为0值强>
[强调我的]
因此,如果将现有行设置为相同的值是可能的,则无法确定更新与插入的行数,因为两个插入与一个具有不同值的更新无法区分+一个具有相同值的更新
答案 1 :(得分:7)
当你的作业是插入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)。