我在專案中遇到一個MongoDB的問題,好多天了還是沒能得到解決,希望得到大牛的指點。
具體問題是:長時間不訪問資料庫的情況下,第一次查詢資料庫所需的時間很長,但是之后的查詢就會很快。
具體情況:
①整個資料庫大小大概在1.9TB左右;
②我查詢的collection的資料大致為700萬條;
③我查詢一次得到的資料為23萬條左右;
④服務器記憶體為120GB;
⑤已按照查詢條件建立了索引,索引資料大小為600MB左右;
⑥第一次查詢所用時間20s左右,之后的查詢在1s以內。
目前考慮的原因:
由于MongoDB不負責記憶體的管理,所以,當長時間未訪問資料庫時,記憶體中的資料即為冷資料,作業系統的記憶體管理程式就會將這部分冷資料釋放,導致下次查詢時,需要重新加載資料到記憶體,所以比較費時。目前,不能夠確定是加載索引比較費時,還是加載資料比較費時。MongoDB雖然提供了touch命令(該命令能夠指定將某個collection的索引資料或者用戶資料加載到記憶體中),但是我使用的是WiredTiger存盤引擎,該命令不支持該存盤引擎。
需要得到的幫助:
①是不是以上原因導致的該問題?
②如果是該原因導致的,如何確定是加載索引費時還是加載資料費時?
③有什么比較好的解決方案么?
注:由于該collection最大會達到25GB左右,而且整個資料庫還有其他很多collection,所以將該collection的所有資料存盤到記憶體是不可取的。如果能夠確認是加載索引費時的話,倒是可以考慮定期將索引加載到記憶體,但是對于WiredTiger存盤引擎,沒有支持該功能的方法,這又是一個問題。
uj5u.com熱心網友回復:
如果對這么大資料必須要這么強的實時性 可以考慮用記憶體引擎替換wiredtigeruj5u.com熱心網友回復:
樓主解決了嗎,同樣遇到類似的問題,時間長不訪問第一次訪問速度很慢。然后再訪問速度就正常了uj5u.com熱心網友回復:
mark一下 我也發現這個問題了 因為我是web訪問的資料所以我一直以為是瀏覽器的問題 看來是mongo的問題uj5u.com熱心網友回復:
系統啟動開始自動進行一次隨機一個資料的查詢不行嗎?uj5u.com熱心網友回復:
每天來個預熱查詢吧。uj5u.com熱心網友回復:
我目前也遇到這個問題,使用explain查詢陳述句發現首次查詢 需要saveState和restoreState 大量資料,第二次這個資料就會小很多,請問樓主這個問題解決了嗎?uj5u.com熱心網友回復:
請問這個mongodb首次查詢慢的問題解決了嗎?uj5u.com熱心網友回復:
首次訪問一定是要走磁盤的,如果磁盤IO慢,則這個程序會很慢,快取包含兩層,一層是作業系統本身的快取,另一層是 WiredTiger 的內部快取,在這一層,資料還會被解壓縮(默認設定下,資料是壓縮存盤的)所以磁盤讀取/解壓縮,這些都會導致首次查詢慢
索引的問題應該不在,它的資料量不大,消耗的磁盤IO不會太大,索引默認是前綴壓縮,這個在 WiredTiger 內部快取中也不需要解壓縮的
確認的方法:你可以建立一個同樣的集合,集合中只包含索引資料,對比一下這個集合與原始集合的首次查詢性能
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/49937.html
標籤:MongoDB
上一篇:求助Access資料庫問題
