Mysql

插入/更新可擴展性(更多記錄,持續更長的查找 — 解決方案?)

  • April 28, 2015

之前發布過這個,但從未收到明確的答案。

我正在從事一個 ETL 項目,基本上是將“票證”的 JSON 記錄輸入 MySQL 數據庫。(實際上想想,可能是遷移到 SQL server,但我不確定這會不會有很大的不同)。

這些 JSON 記錄是每張工單的“目前數據”。

所以它會說,例如:

Ticket_Id: 1 Ticket_Subject: Hi Ticket_Issue: Greeting Ticket_Status: Open

將來我可能會得到這樣的記錄:

Ticket_Id: 1 Ticket_Subject: Hi Ticket_Issue: Greeting Ticket_Status: Closed

這些更新記錄按它們生成的順序儲存……所以很容易瀏覽每一天,解析 JSON,並使用 Ticket 記錄執行插入/更新到 SQL 數據庫/表中。

這就是問題所在。數據庫中目前有 100k 票。在 6 個月內可能會有 500k 張門票。

ETL 過程已經相當緩慢,我需要努力優化每一步。現在,我想專注於 SQL 插入/更新。

目前它正在查找 100k 行……很快它將查找 500k……最終 200 萬……你明白了。這目前不可擴展。

幸運的是,我知道這些票在 30 天不活動後會“存檔”/不可編輯。它們永久“關閉”,永遠不會再更改或更新。

因此,可能有一個邏輯解決方案以某種方式傳輸、鎖定、移動、分區、忽略……我根本不知道……這些“關閉/存檔”票證……所以我只需要執行日常查找反對任何一天的 30k 活躍門票。不是一百萬。

這似乎是一個極其常見的問題(幾乎是任何大型插入/更新難題)……但我在網上沒有找到很多簡單的想法。

我想知道這個問題的簡單、可維護的解決方案是什麼。即使“最簡單的”可悲的是兩張不同的桌子或者你有什麼。我在執行“聯合”選擇語句時沒有問題 — 實際上,“選擇”查詢時間已經非常快而且不是問題。問題是插入/更新/查找/寫入時間。

有任何想法嗎?

在插入記錄時解析 JSON,而不是稍後。(好的,也許您需要在到達和處理之間的“暫存”表中收集 JSON。)

解析 JSON 時,提取您需要在 MySQL 中操作/搜尋/等的欄位。保守一點。不要提取很多欄位。將 JSON 保留原樣,以防您稍後需要詳細資訊。將其壓縮並將其儲存到 BLOB 中甚至會很好——以節省空間,從而減少 I/O。

您將對數據進行哪些查詢?研究它們對於數據倉庫的設計至關重要。

正確索引(等),增長10的表可能慢 10%。不要驚慌,但查看查詢。我見過十億行的桌子很好地嗡嗡作響。

聽起來您每分鐘只插入大約 2 行;那是對的嗎?每秒 100是開始變得具有挑戰性的時候。

在我們討論了我提到的一些問題之後,讓我們擔心“歸檔”。

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