Mysql

關係型數據庫的實時去重策略

  • May 12, 2017

我有一個messages表,其中包含一些欄位,例如id, version,timestamp

我正在嘗試使用在儲存過程中實現的實時重複數據刪除邏輯來插入和檢索消息。

  • 在插入時,如果表中已經存在帶有給定的消息id,我會呼叫一個複雜的重複數據刪除邏輯(一些 IF/ELSE 語句),然後更新消息的version,timestamp等。否則我插入一個新行。
  • 檢索時,我搜尋最舊的消息,不僅選擇它,還更新一些欄位(更改state、設置transient_token等)

問題是,它的工作速度不如我需要的那樣快:插入時約 200 rps,檢索時相同

另外,我的儲存過程執行良好,但是當我同時執行它們時,它們開始在負載 > 30 rps 的情況下爭奪鎖,性能急劇下降並且死鎖會定期出現

**是否有一些最佳實踐來解決我的問題?**我覺得整個方法很糟糕,而不是我的具體實施。

可能我應該為所有傳入消息使用一些臨時緩衝區表並執行重複數據刪除邏輯後記?我會很感激任何想法。

  • 我不能在我的情況下使用 nosql DB(管理決策),我需要使用 Mysql/MariaDb 獲得最大性能

好消息。有一個通常稱為 MERGE 或 UPSERT 的 SQL 命令基本上可以執行此操作。

有關更多資訊,請參閱此頁面: https ://dev.mysql.com/doc/refman/5.7/en/insert-on-duplicate.html

你可能想要這樣的東西:

INSERT INTO messasges (id,version,timestamp) VALUES (1123,1,1/1/2017)
 ON DUPLICATE KEY UPDATE version=2;

將 100 條記錄收集到一個 tmp 表中,然後對它們進行批處理。在批處理中,看到它,您可以先做一個,SELECT然後可能是一批INSERT某個子集和另一批UPDATE其他子集。或者進行處理,直到您可以在一個 IODKU 中完成所有這些操作。

請參閱高速攝取,尤其是“標準化”部分;它討論瞭如何進行類似的批處理。

引用自:https://dba.stackexchange.com/questions/173352