Performance
MongoDB - 慢速刪除查詢
我在 MongoDB 中有一個包含 8 億多條記錄的集合。我想做一些清理工作,但刪除操作真的很慢(無法使用)——即使刪除 1000 條記錄也可能需要 10 多分鐘。
集合中一條記錄的結構是這樣的:
{ 'stID' : '00000001', 'recordID' : '28-4', 'date' : ISODate('2017-06-06 20:00:00'), ...... }
有一個複合索引
{'stID' : 1, 'recordID' : 1, 'date' : 1}
,我的刪除查詢是這樣的:db.coll.remove({ 'stID' : '00000001', 'recordID' : '28-4' }, { multi: true });
數據庫是副本集的一部分,有一個輔助和一個仲裁器,我知道刪除操作必須用要刪除的每條記錄的 _id 填充 oplog,但我仍然很難理解為什麼會這樣慢,尤其是因為:
- 主節點或輔助節點上沒有大量系統或 IO 活動
- 次級不落後於初級
我們從未遇到過查找或寫入/更新操作的問題。您能否建議我應該使用哪些其他參數/命令/工具來查看查詢和伺服器的情況。
我們使用的儲存引擎是 WiredTiger。該伺服器在 RAID 1 配置中具有 128GB 的 RAM 和快速 SSD 驅動器。
我通過使用提高了性能
bulkWrite
:db.ig_posts.bulkWrite([ { deleteMany: { "filter": { /* your query here */ } } ]);
將您的索引之一劃分為組,以便每個組包含不超過 10,000 條記錄。例如,如果您每小時有 2,000 條記錄,請創建一個(或兩個)類似於以下內容的列表:
["2021-04-30T00:00:00Z", "2021-04-30T01:00:00Z", "2021-04-30T02:00:00Z", ...]
執行 for 循環以刪除每小時的記錄。
我能夠在 10 分鐘內刪除大約 1000 萬條記錄。