programing

MongoDB 'count ()'는 매우 느립니다.

sourcetip 2021. 1. 15. 20:26
반응형

MongoDB 'count ()'는 매우 느립니다. 우리는 그것을 어떻게 수정 / 작업합니까?


현재 수백만 개의 데이터 레코드와 함께 MongoDB를 사용하고 있습니다. 나는 꽤 성가신 한 가지를 발견했습니다.

쿼리 된 데이터 수집이 적은 'count ()'함수를 사용하면 매우 빠릅니다. 그러나 쿼리 된 데이터 수집에 수천 또는 수백만 개의 데이터 레코드가 포함되어 있으면 전체 시스템이 매우 느려집니다.

필수 필드를 인덱싱했는지 확인했습니다.

누구든지 똑같은 것을 만났습니까? 이를 개선하기 위해 어떻게해야합니까?


이제 적절한 인덱스를 만드는 것보다 또 다른 최적화가 있습니다.

db.users.ensureIndex({name:1});
db.users.find({name:"Andrei"}).count();

카운터가 필요한 경우 가능할 때마다 미리 계산하는 것이 좋습니다. 원자 $ inc 연산을 사용하고 전혀 사용하지 않습니다 count({}).

그러나 mongodb 사람들은 mongodb에서 열심히 일하고 있으므로 count({})jira bug 에 따라 mongodb 2.1에서 계획하고있는 개선 사항 입니다.


디스크 액세스없이 인덱스가 실제로 사용되는지 확인할 수 있습니다.

이름이 "Andrei"인 레코드를 세고 싶다고 가정 해 보겠습니다.

당신은 (당신이 한 것처럼) 이름에 대한 색인을 확인하고

db.users.find({name:"andrei"}, {_id:0, name:1}).count()

계산하는 가장 빠른 방법 (사전 계산 제외)인지 확인할 수 있습니다.

db.users.find({name:"andrei"}, {_id:0, name:1}).explain() 

true로 설정된 index_only 필드를 표시합니다.

이 트릭은 쿼리가 디스크가 아닌 램 (인덱스)에서만 레코드를 검색하도록합니다.


저에게 해결책은 인덱스를 희소 로 변경하는 것 입니다. 특정 상황에 따라 다르며 가능하면 시도해보십시오.

db.Account.createIndex( { "date_checked_1": 1 }, { sparse: true } )

db.Account.find({    
     "dateChecked" : { $exists : true }    
}).count()

수집 된 31 만 1 천 개의 레코드

  • 0.31 초-희소 인덱스 사용
  • 0.79 초-비 희소 인덱스 사용

지금은 운이 좋지 않습니다. mongodb의 카운트는 끔찍하며 가까운 장래에 더 나아지지 않을 것입니다. 참조 : https://jira.mongodb.org/browse/SERVER-1752

경험상 한 번만 사용하거나 매우 드물게 발생하거나 데이터베이스가 매우 작지 않는 한 절대 사용해서는 안됩니다.

@Andrew Orsich가 말했듯이 가능한 한 카운터를 사용하십시오 (카운터에 대한 몰락은 전역 쓰기 잠금이지만 count ()보다 낫습니다).

참조 URL : https://stackoverflow.com/questions/7658228/mongodb-count-is-very-slow-how-do-we-refine-work-around-with-it

반응형