
基本上我的問題是我有一個包含大約 17,000,000 個產品的大表,我需要非常快速地應用大量更新。
表格有 30 列,id 設定為 int(10) AUTO_INCRMENT。
我有另一個表,該表的所有更新都存儲在其中,這些更新必須預先計算,因為它們需要幾天的時間來計算。表格的格式為[product_id int(10), update_value int(10)]。
我快速發布這1700 萬個更新所採取的策略是將所有這些更新加載到ruby 腳本中的內存中,並將它們分組到數組的哈希中,以便每個update_value 都是一個鍵,每個數組都是已排序的Product_id 的列表。
{
150: => [1,2,3,4,5,6],
160: => [7,8,9,10]
}
然後以以下格式發布更新:
UPDATE product SET update_value = 150 WHERE product_id IN (1,2,3,4,5,6);
UPDATE product SET update_value = 160 WHERE product_id IN (7,8,9,10);
我很確定我這樣做是正確的,因為對已排序的product_id批次發布更新應該是使用 mysql / innodb 執行此操作的最佳方法。
我遇到了一個奇怪的問題,當我測試更新約 1300 萬筆記錄時,這只花了大約 45 分鐘。現在,我正在使用更多數據進行測試,大約 1700 萬筆記錄,更新時間接近 120 分鐘。我本來預計這裡的速度會有所下降,但沒有達到我所看到的程度。
關於如何加快速度或在這個更大的記錄集上什麼可能會減慢我的速度,有什麼建議嗎?
就伺服器規格而言,它們非常好,大量內存/CPU,整個資料庫應該適合內存,並有足夠的增長空間。