MongoDB 無法排序:Sort operation used more than the maximum 33554

閱讀時間約 3 分鐘
當使用以下語法對 Log 這個 Collection 依照 CreateTime 做倒序查詢
db.Log.find().sort({CreateTime: -1})
MongoDB 回傳了以下 Error Msg
Error: error: {
"ok" : 0,
"errmsg" : "Executor error during find command: OperationFailed: Sort operation used more than the maximum 33554432 bytes of RAM. Add an index, or specify a smaller limit.",
"code" : 96,
"codeName" : "OperationFailed"
}

發生原因

MongoDB 在排序時會將資料全部載入記憶體,之後在記憶體中進行排序,而預設開放給排序的記憶體只有 32 MB,因此在大量資料排序時就會引發該錯誤。

解決方案

建立索引

此範例為對 Log 這個 Collection 的 CreateTime 建立降冪排序的 Index
db.Log.createIndex({"CreateTime":-1})
可以用以下指令來查詢此 Collection 上有多少組 Index
db.Log.getIndexes()
增加索引會導致寫入資料速度變慢,且由於需要額外儲存 Index 資訊,會增加儲存資料所佔的空間,但對排序與搜尋有著正向的效能提升,若該欄位時常使用 where 與 sort 則建議可加上索引提高效能。

增加排序可用的記憶體空間

此範例為增加至 320 MB
db.adminCommand({setParameter:1,internalQueryExecMaxBlockingSortBytes:335544320})
若在不增加索引的狀況下修改預設記憶體大小,會導致排序時佔用更多記憶體空間進而影響到資料庫效能,不是一個治標的做法,建議僅在能確保使用量與不適合加入索引時謹慎使用此方案。

結論

在此案例裡,我採取的解決方案是雙管齊下,目的是確保指令可以正確執行,而增加記憶體上限是評估 MongoDB 主機記憶體總大小尚可負擔,可依照需求彈性決定是否對 Collection 上 Index 而同時確保可正常排序查詢

參考資料

分享網站開發的前端、後端、資料庫與部屬維運技術,並記錄在工作上的心得
留言0
查看全部
發表第一個留言支持創作者!
你可能也想看
Google News 追蹤
Thumbnail
接下來第二部分我們持續討論美國總統大選如何佈局, 以及選前一週到年底的操作策略建議 分析兩位候選人政策利多/ 利空的板塊和股票
Thumbnail
🤔為什麼團長的能力是死亡筆記本? 🤔為什麼像是死亡筆記本呢? 🤨作者巧思-讓妮翁死亡合理的幾個伏筆
※ 什麼是MongoDB? MongoDB是一個開源、跨平台的非關聯式資料庫,屬於一種文件導向(Document-oriented database)的資料庫管理系統,也就是 NoSQL 數據庫管理系統(DBMS)。 ※ 什麼是非關聯式資料庫(NoSQL)? 非關聯式資料庫(NoSQL)的意思
Thumbnail
詳細解說如何在 Mac 上透過 Docker 安裝 MongoDB 社群版。包括 MongoDB Compass 的安裝與配置,以及 MongoDB Shell 的使用方法,為開發者提供 MongoDB 學習資源。
Thumbnail
建立一個屬於自己喜愛球員的清單。 ※ 專案開發環境 架設 Node.js 伺服器。 用 Express.js 進行全端開發。 用 MongoDB 資料庫。 ※ 專案開發技術 使用 Express handlebars,為球員清單做出佈局和局部樣板
Thumbnail
為了做登入log紀錄,練習mongoDB來存放log資料,這邊就來紀錄 Laravel 配置mongoDB的實作,而原本我的side project是練習搭建docker開發環境,故這邊會以dockerfile來設定跟紀錄踩坑問題。
MongoDB 是什麼? MongoDB 是一種流行的開源 NoSQL 資料庫,於 2009 年首次發布。與傳統的關係型資料庫系統不同,它不依賴於表格和固定的資料庫結構,而是採用一種基於文件的架構,其中每條記錄都是一個稱為 「文件」 的 JSON 樣式結構。此靈活的結構使 MongoDB 成為許多
Thumbnail
在上一篇文章中,我們講解了 MongoDB 的基本操作,接下來想講講如何更有效率的查詢想要找的資料 模糊查詢 就是查詢的條件只要部分符合就可以找到了,不用查找的關鍵字完全正確,我們直接來舉個例子比較好理解 先假設有以下這些資料 模糊查詢,查找的資料 item 值內有包含 book 就返回 這樣就會找
Thumbnail
以下從社群整理並加上我的一些想法和意見。我的看法偏空,我們先從比較簡單的空方質疑開始,再來看多方的“解釋“。投資任何一家公司,都應該試著正反去看,才能真正搞清自己的感覺,而不是單方面只看到想看的東西。別忘了,我們上個禮拜說了,別跟公司談戀愛。
Authentication create root user In the mongo shell, create a root user to handle everything as follows. mongod.cfg connection Replication
Thumbnail
接下來第二部分我們持續討論美國總統大選如何佈局, 以及選前一週到年底的操作策略建議 分析兩位候選人政策利多/ 利空的板塊和股票
Thumbnail
🤔為什麼團長的能力是死亡筆記本? 🤔為什麼像是死亡筆記本呢? 🤨作者巧思-讓妮翁死亡合理的幾個伏筆
※ 什麼是MongoDB? MongoDB是一個開源、跨平台的非關聯式資料庫,屬於一種文件導向(Document-oriented database)的資料庫管理系統,也就是 NoSQL 數據庫管理系統(DBMS)。 ※ 什麼是非關聯式資料庫(NoSQL)? 非關聯式資料庫(NoSQL)的意思
Thumbnail
詳細解說如何在 Mac 上透過 Docker 安裝 MongoDB 社群版。包括 MongoDB Compass 的安裝與配置,以及 MongoDB Shell 的使用方法,為開發者提供 MongoDB 學習資源。
Thumbnail
建立一個屬於自己喜愛球員的清單。 ※ 專案開發環境 架設 Node.js 伺服器。 用 Express.js 進行全端開發。 用 MongoDB 資料庫。 ※ 專案開發技術 使用 Express handlebars,為球員清單做出佈局和局部樣板
Thumbnail
為了做登入log紀錄,練習mongoDB來存放log資料,這邊就來紀錄 Laravel 配置mongoDB的實作,而原本我的side project是練習搭建docker開發環境,故這邊會以dockerfile來設定跟紀錄踩坑問題。
MongoDB 是什麼? MongoDB 是一種流行的開源 NoSQL 資料庫,於 2009 年首次發布。與傳統的關係型資料庫系統不同,它不依賴於表格和固定的資料庫結構,而是採用一種基於文件的架構,其中每條記錄都是一個稱為 「文件」 的 JSON 樣式結構。此靈活的結構使 MongoDB 成為許多
Thumbnail
在上一篇文章中,我們講解了 MongoDB 的基本操作,接下來想講講如何更有效率的查詢想要找的資料 模糊查詢 就是查詢的條件只要部分符合就可以找到了,不用查找的關鍵字完全正確,我們直接來舉個例子比較好理解 先假設有以下這些資料 模糊查詢,查找的資料 item 值內有包含 book 就返回 這樣就會找
Thumbnail
以下從社群整理並加上我的一些想法和意見。我的看法偏空,我們先從比較簡單的空方質疑開始,再來看多方的“解釋“。投資任何一家公司,都應該試著正反去看,才能真正搞清自己的感覺,而不是單方面只看到想看的東西。別忘了,我們上個禮拜說了,別跟公司談戀愛。
Authentication create root user In the mongo shell, create a root user to handle everything as follows. mongod.cfg connection Replication