MongoDB 쿼리 분석
MongoDB 쿼리 분석은 제안된 인덱스가 효과적인지 확인하고 쿼리문 성능 분석을 위한 중요한 도구입니다.
MongoDB 쿼리 분석에 일반적으로 사용되는 함수는 explain()과 힌트()입니다.
explane() 사용
explanation 연산은 쿼리 정보, 사용 인덱스, 쿼리 통계 등을 제공합니다. 인덱스를 최적화하는 것이 도움이 됩니다.
다음으로 사용자 컬렉션에서 성별 및 user_name에 대한 인덱스를 생성합니다.
>db.users.ensureIndex({gender:1,user_name:1}) </p> <p>现在在查询语句中使用 explain :</p> <pre> >db.users.find({gender:"M"},{user_name:1,_id:0}).explain()
위의 explain() 쿼리는 다음 결과를 반환합니다.
{ "cursor" : "BtreeCursor gender_1_user_name_1", "isMultiKey" : false, "n" : 1, "nscannedObjects" : 0, "nscanned" : 1, "nscannedObjectsAllPlans" : 0, "nscannedAllPlans" : 1, "scanAndOrder" : false, "indexOnly" : true, "nYields" : 0, "nChunkSkips" : 0, "millis" : 0, "indexBounds" : { "gender" : [ [ "M", "M" ] ], "user_name" : [ [ { "$minElement" : 1 }, { "$maxElement" : 1 } ] ] } }
이제 이를 살펴보겠습니다. 결과 집합의 필드:
indexOnly: 필드가 true이며 인덱스를 사용함을 나타냅니다.
cursor: 이 쿼리는 인덱스를 사용하고 MongoDB의 인덱스는 B-트리 구조에 저장되므로 이 쿼리도 BtreeCursor 유형의 커서를 사용합니다. . 인덱스를 사용하지 않으면 커서 유형은 BasicCursor입니다. 이 키는 사용 중인 인덱스의 이름도 제공합니다. 이 이름을 통해 현재 데이터베이스에서 system.indexes 컬렉션을 볼 수 있습니다(인덱스 정보를 저장하기 때문에 시스템이 자동으로 생성합니다. 이에 대해서는 나중에 설명하겠습니다). 인덱스의 자세한 정보를 얻으려면.
n: 현재 쿼리에서 반환된 문서 수입니다.
nscanned/nscannedObjects: 현재 쿼리로 검색된 컬렉션의 문서 수를 나타냅니다. 우리의 목표는 이 값을 개체 수와 더 일관되게 만드는 것입니다. 반환된 문서는 가까울수록 좋습니다.
밀리초: 현재 쿼리에 필요한 시간(밀리초)입니다.
indexBounds: 현재 쿼리에서 구체적으로 사용되는 인덱스입니다.
힌트() 사용
MongoDB 쿼리 최적화 프로그램은 일반적으로 잘 작동하지만 힌트를 사용하여 MongoDB가 특정 인덱스를 사용하도록 할 수도 있습니다.
이 방법을 사용하면 경우에 따라 성능이 향상될 수 있습니다. 색인화된 컬렉션을 가져와 다중 필드 쿼리를 수행합니다(일부 필드는 이미 색인화되어 있습니다).
다음 쿼리 예에서는 성별 및 user_name 인덱스 필드를 사용하여 쿼리하도록 지정합니다.
>db.users.find({gender:"M"},{user_name:1,_id:0}).hint({gender:1,user_name:1})
explain() 함수를 사용하여 위 쿼리를 분석할 수 있습니다.
>db.users.find({gender:"M"},{user_name:1,_id:0}).hint({gender:1,user_name:1}).explain()