[MONGODB] MongoDB를 집계 파이프 라인 느린 첫 경기의 단계 이후
MONGODBMongoDB를 집계 파이프 라인 느린 첫 경기의 단계 이후
나는 첫 번째 일치 단계, 쿼리를 제외하고 모든 단계를 주석 경우 (인덱스 필드 추가 필드 정렬 다시 정렬 붕괴, 페이지, 프로젝트 결과.에 일치)는 단계의 수를 포함하는 MongoDB를 집계 파이프 라인을 가지고 그것은 적절한 인덱스를 활용하는 것으로, 슈퍼 빠른 (0.075 초) 실행합니다. 그때 어떤 수행 단계, 결과가 계산 점점 간단 심지어 뭔가를 따라갈 경우, 쿼리는 27초을 복용 시작!
다음 쿼리는 다음과 같습니다 (인덱스가 빨리 실행에 자신의 일을하고있다으로도 ..., 그것의 복잡성에 빠지지 마십시오)
db.runCommand({
aggregate: 'ResidentialProperty',
allowDiskUse: false,
explain: false,
cursor: {},
pipeline:
[
{
"$match" : {
"$and" : [
{
"CountyPlaceId" : 20006073
},
{
"$or" : [
{
"$and" : [
{
"ForSaleGroupId" : {
"$in" : [
2,
3
]
}
},
{
"$or" : [
{
"ForSaleGroupId" : {
"$nin" : [
2,
3
]
}
},
{
"ListDate" : {
"$gte" : ISODate("2019-02-21T00:00:00.000Z")
}
}
]
},
{
"$or" : [
{
"ForSaleGroupId" : {
"$ne" : 3
}
},
{
"PendingSaleDate" : {
"$gte" : ISODate("2019-02-21T00:00:00.000Z")
}
}
]
}
]
},
{
"ForLeaseGroupId" : {
"$in" : [
2,
3
]
},
"$or" : [
{
"ForLeaseGroupId" : {
"$nin" : [
2,
3
]
}
},
{
"ListDate" : {
"$gte" : ISODate("2019-02-21T00:00:00.000Z")
}
}
]
},
{
"DistressedGroupId" : {
"$in" : [
2,
3,
4
]
},
"$or" : [
{
"DistressedGroupId" : 1
},
{
"DistressedDate" : {
"$gte" : ISODate("2019-02-21T00:00:00.000Z")
}
}
]
},
{
"$and" : [
{
"OffMarketGroupId" : {
"$in" : [
3,
8
]
}
},
{
"$or" : [
{
"OffMarketGroupId" : 1
},
{
"OffMarketDate" : {
"$gte" : ISODate("2019-02-21T00:00:00.000Z")
}
}
]
},
{
"$or" : [
{
"OffMarketGroupId" : {
"$nin" : [
7,
8
]
}
},
{
"SoldDate" : {
"$gte" : ISODate("2019-02-21T00:00:00.000Z")
}
},
{
"OffMarketDate" : {
"$gte" : ISODate("2019-02-21T00:00:00.000Z")
}
}
]
}
]
},
{
"$or" : [
{
"ForSaleGroupId" : {
"$ne" : 1
}
},
{
"OffMarketGroupId" : 6
}
],
"ChangedListPriceDate" : {
"$gte" : ISODate("2019-02-21T00:00:00.000Z")
}
}
]
},
{
"$or" : [
{
"ForSaleGroupId" : {
"$ne" : 1
}
},
{
"ForLeaseGroupId" : {
"$ne" : 1
}
},
{
"OffMarketGroupId" : 6
},
{
"IsListingOnly" : true
},
{
"OrgId" : ""
},
{
"OffMarketDate" : {
"$gte" : ISODate("2018-11-23T00:00:00.000Z")
}
}
]
},
{
"PropertyTypeId" : {
"$in" : [
1,
5,
6
]
}
}
]
}
},
// Other steps ommitted, since it's slow regardless...
{ "$count": "Count" }
]
})
여기에 무엇 샘플 거주 용 대지 문서 외모와 같은 :
{
"_id" : 294401911,
"PropertyId" : 86689647,
"OrgId" : "caclaw-n",
"OrgSecurableId" : 1,
"ListingId" : "19443870",
"Location" : {
"type" : "Point",
"coordinates" : [
-117.316207,
33.104623
]
},
"CountyPlaceId" : 20006073,
"CityPlaceId" : 50611194,
"ZipCodePlaceId" : 70092011,
"MetropolitanAreaPlaceId" : 10041740,
"MinorCivilDivisionPlaceId" : 30002074,
"NeighborhoodPlaceId" : 150813707,
"MacroNeighborhoodPlaceId" : 160051666,
"SubNeighborhoodPlaceId" : null,
"ResidentialNeighborhoodsPlaceId" : 220978234,
"ForSaleGroupId" : 1,
"DistressedGroupId" : 1,
"OffMarketGroupId" : 1,
"ForLeaseGroupId" : 2,
"ForSaleDistressedGroupId" : 1,
"OffMarketDistressedGroupId" : 1,
"ListDate" : ISODate("2019-03-15T00:00:00.000Z"),
"PendingSaleDate" : null,
"OffMarketDate" : null,
"DistressedDate" : null,
"SoldDate" : null,
"ChangedListPriceDate" : null,
"ListPrice" : null,
"ListPriceRangeLow" : null,
"ListPriceRangeHigh" : null,
"ListPricePerSqFt" : null,
"ListPricePerLotSizeSqFt" : null,
"SoldPrice" : 0,
"SoldPricePerSqFt" : 0.0,
"SoldPricePerLotSizeSqFt" : 0.0,
"MonthlyLeaseListPrice" : 6950.0,
"MonthlyLeaseListPricePerSqFt" : 2.5402,
"MonthlyLeaseListPricePerLotSizeSqFt" : 2.5402,
"MonthlyLeaseSoldPrice" : null,
"MonthlyLeaseSoldPricePerSqFt" : null,
"MonthlyLeaseSoldPricePerLotSizeSqFt" : null,
"SoldToListPriceRatio" : 0.0,
"EstimatedToListPriceRatio" : 0.0,
"AppPropertyModeId" : 1,
"PropertyTypeId" : 1,
"PropertySubTypeId" : null,
"Bedrooms" : 4,
"Bathrooms" : 3,
"LivingAreaInSqFt" : 2736,
"LotSizeInSqFt" : NumberLong(5073),
"YearBuilt" : 2004,
"GarageSpaces" : 2,
"BuildingSizeInSqFt" : 2736,
"Units" : 1,
"Rooms" : null,
"NetIncome" : null,
"EstimateTypeId" : 3,
"EstimatedValue" : 1253740,
"EstimatedValuePerSqFt" : 458.2383,
"EstimatedValuePerLotSizeSqFt" : 247.1397,
"CapRate" : null,
"Keywords" : [
"$6,950/month long-term minimum of 30 days. $8,950 June and then $9,950 for July or August. BeautifulWaters End Luxury Home walking distance to the beach. Short or Long term Fully Furnished (1 Month plus) with brand new furnishings & fresh paint & new carpets. Enjoy the beach & golf community lifestyle of Carlsbad, CA in this delightful North County San Diego vacation rental home! This spacious & comfortable two story single family home sits on a cul-de-sac in the gated community of Waters End. Easy walk to the beach and close proximity to the Carlsbad train station, area restaurants, shopping, golf courses, and San Diego theme park attractions. The community also offers many health and beauty spas, yoga, and meditation centers, nearby world-renowned golf courses (such as Torrey Pines, Aviara, and La Costa Resort and Spa) as well as some of the best cycling in all of San Diego County.",
"San Diego (City) (Sd)",
"R1",
"Single Family"
],
"OwnerName" : "Brookside Land Trust, ; State Trustee Services Llc",
"TenantNames" : null,
"Apn" : "214-610-49-00",
"OpenHouseStartDate" : null,
"OpenHouseEndDate" : null,
"ListingPhotoCount" : 25,
"StatusChangedDate" : ISODate("2019-06-28T00:00:00.000Z"),
"SortAddress" : "BrooksideCtZZZZZZZZZZ00000000000000000617ZZZZZCarlsbadCA92011",
"SortOwnerName" : "BrooksideLandTrust,;State",
"ListingIdAlphaNum" : "19443870",
"IsListingOnly" : false
}
카운트는 27,815 결과를 반환합니다. 제 정합 단계는 매우 빠르게 실행하면서 I는 인덱싱이 문제가있는 것으로 보이지 않는다. 여전히 erroring없이 쿼리를 실행하는 것 거짓 아직 : 나는 또한 allowDiskUse을 설정하고 있습니다로, 집계 파이프 라인 단계 당 메모리 제한에 100MB의 타격에 문제가있는 것으로이 표시되지 않습니다.
또한 관심의 동일한 수집에 대한 다른 집계 파이프 라인 쿼리는 첫 경기 단계 이후 45081 개 기록까지 필터링, 그리고 그것은 단지 3 초 만에 반환 후 아직 나는 수를 실행할 때. 그래서 문서 구조가 정말이 문제에 대한 비난 할 수 없습니다.
무엇 그래서 도대체 여기 일이야? 왜 경기가 카운트로, 너무 빨리 이후 아직 작업을 간단하게라도 뭔가를 필터링되기 때문에 매우 느리다? 나는 설명 활성화시키는 시도했다 : 사실 나는 거기에 눈에 띄는 아무것도 표시되지 않습니다. 그것은 적절한 인덱스를 사용하고 경기 운영을 보여줍니다. 카운트 동작은 설명에서 추가 세부 사항을 포함하지 않습니다.
해결법
-
==============================
1.2019 답변
2019 답변
이 답변은 MongoDB를 4.2입니다
질문과 사람 사이의 토론을 읽은 후, 나는 문제가 해결하지만 여전히 최적화하여 MongoDB를 사용하는 모든 사람에 대한 일반적인 문제가 있다고 생각합니다.
저도 같은 문제를 직면하고, 여기에 쿼리 최적화를위한 도움말입니다.
틀 렸으면 말해줘 :)
컬렉션 인덱스를 추가하십시오
인덱스는 인덱스가 이송에 용이 한 형태로 컬렉션의 데이터 세트를 저장할 수있는 데이터 구조입니다 빨리으로 쿼리를 실행에 중요한 역할을한다. 쿼리를 효율적으로하여 MongoDB에서 인덱스의 도움으로 실행됩니다.
당신은 당신의 필요에 따라 인덱스의 다른 유형을 만들 수 있습니다. 여기 공식 MongoDB의 문서를 인덱스에 대해 자세히 알아보십시오.
2. 파이프 라인의 최적화
인덱스를 다시 작성합니다
당신이 작성하고 인덱스를 삭제하는 경우 매우 자주 다음 인덱스를 다시 작성. 그것은 MongoDB를 새로 고침하는 데 도움이 필요한 쿼리 계획을 인계에 유지에 이전에 저장된 쿼리 계획, 캐시, 날 믿어, 그 문제는 짜증 :(
원치 않는 인덱스를 제거하십시오
너무 많은 인덱스는 그들의 작업과 함께 인덱스를 생성해야하므로, 업데이트 및 삭제 작업을 만들기에 너무 많은 시간이 걸립니다. 그래서 그들에게 많은 도움이 제거합니다.
5. 제한 문서
실제 시나리오에서는 데이터베이스에 전체 데이터 선물을 가져 오는 것은 도움이되지 않습니다. 또한, 당신은 그것을 표시 할 수 없습니다 또는 사용자는 완전한 가져온 데이터를 읽을 수 있습니다. 그래서, 대신 완전한 데이터를 가져 오는 중, 모두 당신과보고 클라이언트 데이터를하는 데 도움이 청크 데이터를 가져.
그리고 마지막으로 MongoDB를가 주요 문제를 파악하는 데 도움이에 의해 실행 계획을 선택한 것을보고. 그래서, $ 설명은 아웃 파악에 도움이 될 것입니다.
이 요약은 내가 어떤을 놓친 경우 새로운 점을 제안 자유롭게 너희들을 도움이되기를 바랍니다. 나도 추가됩니다.
from https://stackoverflow.com/questions/57595803/mongodb-aggregate-pipeline-slow-after-first-match-step by cc-by-sa and MIT license
'MONGODB' 카테고리의 다른 글
[MONGODB] 어떻게 몽구스와 기존 모음에 액세스 할 수? (0) | 2019.12.07 |
---|---|
[MONGODB] 필드가 문자열을 포함하는 경우 확인 (0) | 2019.12.07 |
[MONGODB] $ 조회 집계 필드를 제외 (0) | 2019.12.07 |
[MONGODB] 데이터베이스를 따기 후 인증합니다 (0) | 2019.12.07 |
[MONGODB] 모든 문서의 배열의 단지 중첩 된 문서를 반환하는 방법 (0) | 2019.12.07 |