모음 이벤트에는 userId와 이벤트 배열이 있습니다. 배열의 각 요소는 포함 된 문서입니다. 예 :mongodb - 날짜의 색인이 사용되지 않습니다.
db.events.find({ events : { $elemMatch: { "eventId" : 201,
"eventDate" : {$gt : new Date(1231657163876) } } } } ).explain()
쿼리 계획 "events.eventDate"에 대한 색인이 때 사용되는 것을 보여줍니다 : 지난 30 일 동안 생성 된 이벤트 tofind 아래와 같은 쿼리를 사용
{
"_id" : ObjectId("4f8f48cf5f0d23945a4068ca"),
"events" : [
{
"eventType" : "profile-updated",
"eventId" : "247266",
"eventDate" : ISODate("1938-04-27T23:05:51.451Z"),
},
{
"eventType" : "login",
"eventId" : "64531",
"eventDate" : ISODate("1948-05-15T23:11:37.413Z"),
}
],
"userId" : "junit-19568842",
}
테스트 데이터는 (20의 주위에) 적은 수의 이벤트를 포함
{
"cursor" : "BtreeCursor events.eventDate_1",
"nscanned" : 0,
"nscannedObjects" : 0,
"n" : 0,
"millis" : 0,
"nYields" : 0,
"nChunkSkips" : 0,
"isMultiKey" : true,
"indexOnly" : false,
"indexBounds" : {
"events.eventDate" : [
[
ISODate("2009-01-11T06:59:23.876Z"),
ISODate("292278995-01--2147483647T07:12:56.808Z")
]
]
}
}
012 (500 정도) 사건의 수가 많은 경우에는 3,516,은, 인덱스가 사용되지 않습니다
{
"cursor" : "BasicCursor",
"nscanned" : 4,
"nscannedObjects" : 4,
"n" : 0,
"millis" : 0,
"nYields" : 0,
"nChunkSkips" : 0,
"isMultiKey" : false,
"indexOnly" : false,
"indexBounds" : {
}
} 많은 이벤트가있을 때 왜 인덱스가 사용되지 않는
? 많은 이벤트가있을 때 MongoDB는 인덱스를 사용하는 것보다 모든 항목을 스캔하는 것이 효율적이라는 것을 알 수 있습니까?
0 밀리 초를 반환하는 쿼리에서 최적화 프로그램이 인덱스를 사용하지 않는다고 불평하십니까? :) –
위의 Explain 출력은 테스트 콜렉션에서 나온 것입니다. 약 2 천만 건의 문서로 질의는 약 8 초가 걸렸습니다. – dsatish
컬렉션의 문서 중 상당 부분을 쿼리하는 경우 이와 같은 범위 쿼리는 느려질 수 있습니다. 인덱스를 사용하여 속도를 비교하도록 힌트를 사용할 수는 있지만 인덱스 스캔을 수행하는 것과 마찬가지로 속도가 느릴 것이라고 생각합니다. 힌트의 유무와 관계없이 프로덕션 데이터의 설명을 게시해야합니다. 문제는 일치하는 문서가 수백만 개가 발견되면 문서를 검사하는 데 시간이 걸릴 것입니다. –