[MONGODB] 어떻게 화합물 인덱스의 순서는 MongoDB의 성능 현명한에 문제가 있습니까?
MONGODB어떻게 화합물 인덱스의 순서는 MongoDB의 성능 현명한에 문제가 있습니까?
우리는 매개 변수가 조회되는 것과 같은 순서로 복합 인덱스를 작성해야합니다. 이 순서는 성능 현명한 전혀 중요합니까?
우리는 섹스에 대한 인덱스 (시간의 99.9 % "남성"또는 "여성"하지만 문자열 nontheless (이진되지 않음))와 이름에 대한 인덱스와 지구상의 모든 인간의 컬렉션을 상상해보십시오.
우리는 예를 들어, 특정 이름을 가진 특정 성별의 모든 사람을 선택 할 수 있도록하려는 것입니다 경우 "요"라는 s의 모든 "남성"더 나은 첫 섹스와 복합 인덱스가하거나 이름입니까? 왜 (안)?
해결법
-
==============================
1.Redsandro,
Redsandro,
당신은 인덱스 카디널리티, 선택을 고려해야합니다.
인덱스 카디널리티는 필드에 얼마나 많은 수있는 값을 의미한다. 필드 섹스는 두 가지 값이 있습니다. 그것은 매우 낮은 카디널리티가 있습니다. 등 이름, 사용자 이름, 전화 번호, 이메일, 같은 다른 분야는 높은 카디 간주됩니다 수집, 모든 문서에 대한 더 고유 한 값을가집니다.
또한, 선택적으로 인덱스와 인덱스 필드 가능한 문서의 수를 제한 쓰기 쿼리를 사용하고 싶습니다. 간단하게하려면 다음 수집을 고려하십시오. , 쿼리를 실행할 경우 : 인덱스가 {1 이름} 인 경우 {이름 : "존", 성별 : "남성"}. 당신은 1 문서를 스캔해야합니다. 당신이 사용할 수 있기 때문에 MongoDB를 선택적 수 있습니다.
{_id:ObjectId(),name:"John",sex:"male"} {_id:ObjectId(),name:"Rich",sex:"male"} {_id:ObjectId(),name:"Mose",sex:"male"} {_id:ObjectId(),name:"Sami",sex:"male"} {_id:ObjectId(),name:"Cari",sex:"female"} {_id:ObjectId(),name:"Mary",sex:"female"}
다음 수집을 고려하십시오. 색인은 {섹스 : 1} 인 경우, 쿼리를 실행하면 {성별 : "남성"이름 : "존"}. 당신은 4 문서를 스캔해야합니다.
{_id:ObjectId(),name:"John",sex:"male"} {_id:ObjectId(),name:"Rich",sex:"male"} {_id:ObjectId(),name:"Mose",sex:"male"} {_id:ObjectId(),name:"Sami",sex:"male"} {_id:ObjectId(),name:"Cari",sex:"female"} {_id:ObjectId(),name:"Mary",sex:"female"}
더 큰 데이터 세트에 가능한 차이를 상상해보십시오.
이 복합 인덱스에 대한 잘못된 가정을 쉽게 만들 수 있습니다. 화합물 인덱스의 MongoDB의 워드 프로세서 장치.
당신은 복합 인덱스를 만들 때, 1 지수는 여러 필드를 개최한다. 우리 지수에 의해 수집한다면 { "섹스": 1, "이름": 1}, 인덱스처럼 거의 보일 것이다 :
["male","Rick"] -> 0x0c965148 ["male","John"] -> 0x0c965149 ["male","Sean"] -> 0x0cdf7859 ["male","Bro"] ->> 0x0cdf7859 ... ["female","Kate"] -> 0x0c965134 ["female","Katy"] -> 0x0c965126 ["female","Naji"] -> 0x0c965183 ["female","Joan"] -> 0x0c965191 ["female","Sara"] -> 0x0c965103
우리가 인덱스에 의해 수집하는 경우 { "이름": 1, "섹스": 1}, 인덱스는 약처럼 보일 것이다 :
["John","male"] -> 0x0c965148 ["John","female"] -> 0x0c965149 ["John","male"] -> 0x0cdf7859 ["Rick","male"] -> 0x0cdf7859 ... ["Kate","female"] -> 0x0c965134 ["Katy","female"] -> 0x0c965126 ["Naji","female"] -> 0x0c965183 ["Joan","female"] -> 0x0c965191 ["Sara","female"] -> 0x0c965103
{이름 : 1}를 갖는 접두어로하는 복합 인덱스를 사용하여 훨씬 더 나은 서비스를 제공합니다. 더 많은 주제에 읽을 수있다, 나는 이것이 약간의 선명도를 제공 할 수 있기를 바랍니다.
-
==============================
2.나는이에 자신을 실험을했고, 처음으로 제대로 구별 인덱스 키를 사용하는 성능 저하 없을 것 같다 발견 말할거야. (I mmap에 상이 할 수도있는 wiredtiger와 MongoDB를 사용하고 3.4). 나는 항목이라는 새 컬렉션에 2 억 5 천만 문서를 삽입. 각각의 문서는 다음과 같이 보았다 :
나는이에 자신을 실험을했고, 처음으로 제대로 구별 인덱스 키를 사용하는 성능 저하 없을 것 같다 발견 말할거야. (I mmap에 상이 할 수도있는 wiredtiger와 MongoDB를 사용하고 3.4). 나는 항목이라는 새 컬렉션에 2 억 5 천만 문서를 삽입. 각각의 문서는 다음과 같이 보았다 :
{ field1:"bob", field2:i + "", field3:i + ""
"필드 1"언제나 "밥"을 동일. 완전히 독특 있도록 "FIELD2는"내가 동일했다. 우선은 FIELD2에서 검색을했고, 그것은 250,000,000 문서를 스캔하는 분을 인수했다. 그럼 난과 같이 인덱스를 생성 :
`db.items.createIndex({field1:1,field2:1})`
인덱스가 원하는 문서를 발견하기 전에 항목의 수를 검색해야한다, 그래서 "밥"이 모든 하나의 문서에 필드 1 물론. 그러나, 이것은 내가 가진 결과가 아니었다.
인덱스 작성을 완료 한 후 나는 컬렉션 다른 검색을했다. 이번에는 내가 아래에 나열된 결과를 얻었다. 당신은 "totalKeysExamined는"때마다 1 볼 수 있습니다. 그래서 아마도 유선 호랑이 또는 뭔가 그들은이 더 나은 작업을 수행하는 방법을 알아 낸. 그게 함께 할 수있는 뭔가가있을 수 있습니다, 그래서 나는, 실제로는 인덱스 접두사를 압축 wiredtiger을 읽었습니다.
db.items.find ({필드 1은 "밥", FIELD2 : "250888000은"}). ( "executionStats")를 설명
{ "executionSuccess" : true, "nReturned" : 1, "executionTimeMillis" : 4, "totalKeysExamined" : 1, "totalDocsExamined" : 1, "executionStages" : { "stage" : "FETCH", "nReturned" : 1, "executionTimeMillisEstimate" : 0, "works" : 2, "advanced" : 1, ... "docsExamined" : 1, "inputStage" : { "stage" : "IXSCAN", "nReturned" : 1, "executionTimeMillisEstimate" : 0, ... "indexName" : "field1_1_field2_1", "isMultiKey" : false, ... "indexBounds" : { "field1" : [ "[\"bob\", \"bob\"]" ], "field2" : [ "[\"250888000\", \"250888000\"]" ] }, "keysExamined" : 1, "seeks" : 1 } }
그럼 (필드 2와 같은 값을 갖는다) FIELD3에 인덱스를 생성. 그럼 내가 검색 :
db.items.find ({FIELD3 : "250888000"});
이 복합 인덱스를 가지는 것과 같은 4ms의했다. 나는 FIELD2 및 FIELD3이 서로 다른 값으로 여러 번 반복 사소한 차이가 각 시간을 얻었다. 이 wiredtiger와, 인덱스의 첫 번째 필드에 가난한 차별화를 가진에 대한 성능 저하가 없음을 의미한다.
from https://stackoverflow.com/questions/33545339/how-does-the-order-of-compound-indexes-matter-in-mongodb-performance-wise by cc-by-sa and MIT license
'MONGODB' 카테고리의 다른 글
[MONGODB] 몽고 그룹 푸시 : 모든 필드를 밀어 (0) | 2019.12.17 |
---|---|
[MONGODB] MongoDB의 여러 컬렉션에서 검색 (0) | 2019.12.17 |
[MONGODB] MongoDB의 : 배열 매칭 매개 변수에서 하위 문서 찾기 (0) | 2019.12.17 |
[MONGODB] MongoDB의 가치에 의해 곱하기 필드 (0) | 2019.12.16 |
[MONGODB] 어떻게 삽입 시간 유성 모음을 정렬 할 수 있습니다? (0) | 2019.12.16 |