我有一個包含大量數據的表格。數據的來源是一個外部API。每隔幾個小時,我需要同步數據庫,以便更改從外部api更新。我正在進行完全同步(api不允許增量同步)。MySQL:更新大型表格的最佳方法
發生同步時,我想確保數據庫中的數據也可以讀取。所以,我按照下面的步驟:
- 我在表中有一個cloumn作爲數據是否可讀的標誌。只有帶有標誌設置的數據被標記爲可讀。
- 我將api的所有數據插入表中。
- 一旦寫入所有數據,我將刪除標記集中表中的所有數據。
- 刪除後,我正在更新表並設置所有行的標誌。
表約有5000萬行左右,預計會增長。表中有一個customerId字段。同步通常基於customerId,並將其傳遞給api。
我的問題是,上面的步驟3和4需要很多時間。查詢是這樣的:
第3步 - >delete from foo where customer_id=12345678 and flag=1
第4步 - >update foo set flag=1 where customer_id=12345678
我試圖劃分基於CUSTOMER_ID的表以及CUSTOMER_ID少的行數它的偉大工程,但對於某些customer_id,每個分區本身的行數都會達到〜500萬。
大約90%的數據在兩次同步之間沒有變化。我怎樣才能讓這個速度更快?
我正在考慮只使用更新查詢,而不是插入查詢,然後檢查是否有任何更新。如果不是,我可以爲同一行發出插入查詢。這樣,任何更新都將與插入一起處理。但我不確定在更新過程中操作是否會阻止讀取查詢。
此api是否返回每個項目的最後一次更改的時間戳記? – krasipenkov
關於分區方法,您是如何執行刪除操作的?通過刪除整個客戶分區或普通的選擇? – krasipenkov
@ agarwalankur85如果我理解正確,表只讀(對用戶,而不是API和你的國旗當然),並且所有的行都被api完全重新插入到表中。你可以定義一個不同的表作爲你的api插入的目的地(api寫入的地方,你可以將這些行移動到真正的表)?而且,由於您目前有一段時間可以讀取0行(介於3到4之間),因此我認爲(短)的宕機時間可以接受?最後但並非最不重要的是:你的mysql版本是什麼? – Solarflare