2012-06-07 67 views
9

我有一張非常大的表,主鍵爲BINARY(20)獲取爲ON DUPLICATE KEY UPDATE多插入插入的行數?

該表有1700萬行左右。每個小時一個cron作業都會嘗試使用ON_DUPLICATE_KEY_UPDATE語法在此表中插入多達50,000個新條目。

cronjob中的每個插入都有1,000個值(多個插入)。如何從此查詢中獲取插入到表中的行數?由於行數大約爲1700萬行,因此我無法進行行計數,而且查詢太昂貴。

在手動MySQL的說,對於行插入的行受影響的數量是1和更新的領域是2,我在1000 INSERT對重複密鑰更新查詢這意味着我可以有受影響的行從1000 - 2000,但我無法告訴從這個數字插入了多少記錄?

我該如何克服這個問題?

謝謝

回答

11

插入數量是2000減去受影響的行數。更一般地說:

(numberOfValuesInInsert * 2) - mysql_affected_rows() 

編輯:

由於tomas points out,該MySQL docs居然說:

隨着對重複密鑰更新,每行受影響的行值是1,如果排作爲新行插入,如果現有行更新爲2,則爲,如果現有行被設置爲其當前值,則爲0。

[重點煤礦]

因此,如果現有行設置爲相同的值是可能的,這是不可能告訴多少行更新與插入,因爲兩個插件將無法區分一個用不同的值更新+用相同的值更新一次。

+0

我的數學是不是最好的,我不能讓我的頭一輪這一笑,我會做一些測試,謝謝哥們。 – Griff

+0

你的確是正確的感謝傢伙救了我的一天:) – Griff

+0

這asnwer假定我們會得到1或2的每一行。 從MySQL的文檔: 對於INSERT ... ON DUPLICATE密鑰更新語句,每行中的受影響的行值是1,如果該行被插入作爲一個新的行,2如果現有的行被更新,和0如果一個現有的行設置爲當前值 所以,我認爲,如果現有的行保持不變,我們會得到0,這是不行的..:謝謝/ – tomas

6

當您的作業插入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 - 未插入

行的更新=一三五零年至1000年(在這個例子中)。

更新= 350。在方程更新的

替換值(1),將得到

插頁= 650

因此得到更新的數目,只需要(3)直接使用方程。

+0

因此,這假定有插入和更新,這並不總是如此。它可以是其他情況之一:僅插入,僅更新,不插入或更新。在這些情況下可以找出純插入物的數量嗎? – satoru

+0

公式(1)是不是在這裏準確的,因爲如果行設置爲它的當前值,我們得到0,所以你會得到:(1)插入+更新+不變=無行插入。 給出3個變量,並使其無法解析:/ – tomas

相關問題