찾다

 >  Q&A  >  본문

MongoDB数据库长时间未访问,首次查询时,用时较长。如何解决?

我在项目中遇到一个MongoDB的问题,好多天了还是没能得到解决,希望得到大牛的指点。
具体问题是:长时间不访问数据库的情况下,第一次查询数据库所需的时间很长,但是之后的查询就会很快。
具体情况:

①整个数据库大小大概在1.9TB左右;
②我查询的collection的数据大致为700万条;
③我查询一次得到的数据为23万条左右;
④服务器内存为120GB;
⑤已按照查询条件建立了索引,索引数据大小为600MB左右;
⑥第一次查询所用时间20s左右,之后的查询在1s以内。

目前考虑的原因:

由于MongoDB不负责内存的管理,所以,当长时间未访问数据库时,内存中的数据即为冷数据,操作系统的内存管理程序就会将这部分冷数据释放,导致下次查询时,需要重新加载数据到内存,所以比较费时。目前,不能够确定是加载索引比较费时,还是加载数据比较费时。MongoDB虽然提供了touch命令(该命令能够指定将某个collection的索引数据或者用户数据加载到内存中),但是我使用的是WiredTiger存储引擎,该命令不支持该存储引擎。

需要得到的帮助:

①是不是以上原因导致的该问题?
②如果是该原因导致的,如何确定是加载索引费时还是加载数据费时?
③有什么比较好的解决方案么?

注:由于该collection最大会达到25GB左右,而且整个数据库还有其他很多collection,所以将该collection的所有数据存储到内存是不可取的。如果能够确认是加载索引费时的话,倒是可以考虑定期将索引加载到内存,但是对于WiredTiger存储引擎,没有支持该功能的方法,这又是一个问题。
为情所困为情所困2754일 전1066

모든 응답(1)나는 대답할 것이다

  • phpcn_u1582

    phpcn_u15822017-05-02 09:28:08

    말씀하신 문제는 작업 세트와 관련된 문제입니다.

    1. 워킹셋이란?

    MongoDB의 메모리 관리에 있어서 중요한 개념입니다. 메모리 관리에서는 자주 액세스하는 데이터 세트 및 관련 인덱스를 메모리에 배치하십시오.

    2. 작업 세트를 메모리에 배치하는 방법은 무엇입니까?

    귀하의 설명에서는 실제로 작업 세트를 미리 예열하고 메모리에 배치해야 함을 의미합니다(예비 로드 또는 예열). 구체적으로 어떻게 해야 할까요? 터치(MMAP 엔진)를 언급했는데 후속 버전(WT 엔진)에서는 어떻게 구현하나요?

    관계형 데이터베이스라면 자주 사용하는 방법은 select *입니다. 성능 테스트를 할 때 좋은 결과를 얻기 위해 일괄적으로 Select 문을 미리 실행하여 메모리를 워밍업하는 경우가 많습니다.

    MongoDB에서는 다음을 고려하세요.

    1) Covered Index를 비즈니스 쿼리에 직접 사용할 수 있거나 인덱스를 워밍업해야 하는 경우:

    db.collection.find({}, {"_id" : 0, "field_a" : 1, "field_b" : 1}).hint({"field_a" : 1, "field_b" : 1}). 설명()

    2) 작업 세트를 예열해야 하는 경우 컬렉션의 어떤 데이터에 일반적으로 특정 기간 동안 자주 액세스해야 하는지 아는 것이 전제입니다. 그런 다음 이 컬렉션에 대해 위와 동일한 방법을 사용합니다. 워밍업하는 기간.

    차이점은 인덱스를 예열하면 모든 인덱스가 예열되므로 쿼리 조건은 {}인 반면, 작업 세트를 예열하면 컬렉션의 데이터 중 특정 부분만 예열되므로 쿼리 조건은 시간과 관련된 조건이 될 수 있습니다. 범위.

    참고로.

    MongoDB를 사랑해주세요! 재미있게 보내세요!


    MongoDB 중국 커뮤니티 심천 사용자 컨퍼런스

    이번 토요일에 약속잡자

    자세한 내용을 입력해주세요

    회신하다
    0
  • 취소회신하다