我有一个非常大的表,主键是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.
[强调我的]
因此,如果将现有行设置为相同的值是可能的,则无法确定更新与插入的行数,因为两个插入与一个具有不同值的更新无法区分+一个具有相同值的更新.
当您的作业执行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).