Mysql

在批量更新期間選擇 MySQL 行

  • October 23, 2021

我目前有一個包含 500K 行的數據庫,未來可能會增長到 300 萬行。表的結構如下所示:

-id

-price

-sku

-version(由日期時間字元串表示,即 20211012)

我有一個 ETL 作業,它將每晚更新價格和版本列,只有 UPDATE 語句,沒有 INSERT 和 DELETE。我的問題是為了顯示該項目,我需要按 sku 和版本進行查詢。在 ETL 作業執行之前,一切正常。但是,當 ETL 作業開始批量更新行時,版本會發生變化,並且由於版本不匹配,我不再能夠選擇該特定 sku。

我解決此問題的想法是跟踪 ETL 作業執行的先前和目前版本(即 20211012 和 20211013),以便在記錄已更新或回退到先前版本時嘗試選擇目前版本如果 ETL 作業尚未更新該特定對象。

有什麼我應該注意的陷阱嗎?如果我對 ETL 作業同時更新的特定記錄執行 SELECT 會發生什麼?

CREATE TEMPORARY TABLE ...;  -- to hold the day's updates
LOAD DATA ...; -- into that table
massage the data if anything needs 'fixing'
INSERT INTO real_table (col1, ...)
   SELECT col1, ...
       FROM temp_table
   ON DUPLICATE KEY UPDATE
       ...;

全部一次性完成。處理插入、更新(但不處理刪除)

如果阻止使用表的時間過長,請參閱以下內容以分塊 upsert 步驟:http: //mysql.rjweb.org/doc.php/deletebig#deleting_in_chunks

實際上,陳舊的數據是最壞的情況。可能想要查看事務隔離級別並正確配置您的實例以最適合您可以處理的情況。在這種情況下,可重複讀取可能是一個可靠的開始,並將您的更新批處理到單行語句中。您可以一次將它們批處理 10k 行。

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