2009-01-21 90 views
8

目前我正在使用的系統的一部分涉及mysql中的日誌,計數頻繁更新。如果更新失敗,MySQL函數插入記錄?

被插入的數據是格式:

date | name | count | 
-----------+------+-------+ 
2009-01-12 | alan | 5 | 
2009-01-12 | dave | 2 | 
2009-01-12 | mary | 1 | 

該數據被定期從平面文件,在用於分貝插入/更新準備概括爲上述解析 - 在數據庫上的唯一鍵是(date, name)雙。

以前,在決定更新或插入之前,此係統會檢查現有表中是否存在給定datename對的任何記錄。

我們遇到的問題是,隨着此表的增長,響應時間並沒有變得更好,我們希望儘可能減少查詢次數。

該系統最近進行了更新運行INSERT ... ON DUPLICATE KEY UPDATE查詢,已略微降低的select S上的數字,但我們的一些距離常見的情況是update

我想知道是否有人知道一個mysql函數的本質是INSERT ... ON DUPLICATE KEY UPDATE反向,即將嘗試更新一行,如果沒有匹配,然後執行插入?


編輯

我沒有做它上面的太清楚,我想,當我有記錄('2009-01-12','alan','5')例如做什麼,就是:

UPDATE table SET count = count+5 WHERE date = '2009-01-12' and name = 'alan'; 

,如果上面的失敗,插入上面的數據。增加計數器的需要是爲什麼REPLACE不起作用。更換執行刪除操作&插入,並且不會讓你指的是該行被刪除,所以count = count + 5不會增加由5

@jasoncohen以前count值 - INSERT ... ON DUPLICATE KEY UPDATE不會做的工作,但我我問是否有更好的方法來做到這一點。

對不起原始措辭造成的任何混淆!

回答

3

這是一樣的。使用「UPDATE ... ON NO KEY INSERT」,數據庫引擎仍然必須首先檢查是否有更新內容。因此,即使更新是最常見的,也不需要單獨的結構

+0

有道理,希望得到更多的希望比期望有一些神奇的,超級執行的MySQL查詢! – ConroyP 2009-01-25 20:51:15

0

爲什麼INSERT不夠?即使大多數情況下它是重複密鑰,因此是更新(而不是其他方式),它仍然是正確的操作權限?

你只是要求關注性能嗎?

1

我一直在試圖弄清楚你想要什麼樣的極端,而且正如我所看到的,如果數據匹配,你不想做任何事情?我沒有看到一個解決方案,如果「計數」以某種方式將改變,並需要更新,你堅持INSERT INTO ON DUPLICATE KEY UPDATE(我真的不明白這個問題)。但是,如果計數永遠不會更新,那麼您可能想要查看INSERT IGNORE INTO,如果唯一鍵(date + name)已經存在,它將忽略插入。

您有沒有考慮過「沖洗/旋轉」您的平面文件只爲檢查添加材料?或者這不可能?

編輯:

的INSERT將立即失敗,因爲重複鍵衝突,並引發在這種情況下,UPDATE。根本不應該有任何性能問題。我在非常大的數據庫上一直這樣做,從空數據庫開始而不是已經填充的數據庫時,我沒有注意到任何巨大的性能差異。

但是,不時運行ANALYZE TABLE/OPTIMIZE TABLE可能是件好事,以保持索引狀態良好。