我有一个非常大的表,主键为 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)。