Docs Menu
Docs Home
/ / /
Node.js
/

Indexes

이 페이지의 내용

  • 개요
  • 쿼리 커버리지 및 성능
  • 운영 고려 사항
  • 인덱스 유형
  • 단일 필드 인덱스
  • 복합 인덱스
  • 다중 키 인덱스(배열 필드의 인덱스)
  • 클러스터화된 인덱스
  • Text Indexes
  • 지리 공간적 인덱스
  • Unique Indexes
  • 인덱스 나열

인덱스는 MongoDB에서 효율적인 쿼리 실행을 지원하는 데이터 구조입니다. 문서에 데이터 일부의 사본이 포함되어 있어 쿼리를 보다 효율적으로 수행할 수 있습니다.

인덱스가 없으면 MongoDB는 컬렉션의 모든 문서를 스캔하여 각 쿼리와 일치하는 문서를 찾아야 합니다. 이러한 컬렉션 스캔은 속도가 느리고 애플리케이션 성능에 부정적인 영향을 미칠 수 있습니다. 인덱스를 사용하여 MongoDB가 스캔하는 문서 수를 제한하면 쿼리를 더욱 효율적으로 수행하고 결과를 더 빨리 반환할 수 있습니다.

MongoDB에 대해 쿼리를 실행할 때 쿼리에는 다음 세 부분이 포함될 수 있습니다.

  • 찾고 있는 필드와 값을 지정하는 쿼리 기준

  • 쿼리 실행에 영향을 주는 옵션(예: 읽기 고려)

  • MongoDB가 반환해야 하는 필드를 지정하기 위한 프로젝션 기준(선택 사항)

쿼리 기준 및 쿼리 프로젝션에 지정된 모든 필드가 인덱싱되면 MongoDB는 컬렉션의 문서를 스캔하거나 메모리에 로드하지 않고 인덱스에서 직접 결과를 반환합니다.

인덱스가 쿼리 기준 및 프로젝션을 포함하는지 확인하는 방법에 대한 자세한 내용은 쿼리 커버리지인덱스 교차에 대한 MongoDB 매뉴얼 문서를 참조하세요.

쿼리 성능을 향상시키려면 애플리케이션의 쿼리와 정렬된 결과를 반환하는 작업에 자주 나타나는 필드에 인덱스를 빌드합니다. 추가하는 각 인덱스는 활성화되면 디스크 공간과 메모리를 사용하므로 용량 계획을 위해 인덱스 메모리와 디스크 사용량을 추적해야 합니다. 또한 쓰기 작업이 인덱싱된 필드를 업데이트할 때 MongoDB도 관련 인덱스를 업데이트해야 합니다.

데이터 모델을 설계하고 애플리케이션에 적합한 인덱스를 선택하는 방법에 대한 자세한 내용은 인덱싱 전략데이터 모델링 및 인덱스에 대한 MongoDB 서버 설명서를 참조하세요.

MongoDB는 데이터 쿼리를 지원하기 위해 다양한 인덱스 유형을 지원합니다. 다음 섹션에서는 가장 일반적인 인덱스 유형을 설명하고 각 인덱스 유형을 생성하기 위한 샘플 코드를 제공합니다.

단일 필드 인덱스는 문서의 단일 필드에 오름차순 또는 내림차순 정렬 순서를 지정하는 쿼리의 성능을 향상시키는 인덱스입니다.

다음 예제에서는 createIndex() 메서드를 사용하여 sample_mflix database의 movies collection에 있는 title 필드에 오름차순 인덱스를 생성합니다.

const database = client.db("sample_mflix");
const movies = database.collection("movies");
// Create an ascending index on the "title" field in the
// "movies" collection.
const result = await movies.createIndex({ title: 1 });
console.log(`Index created: ${result}`);

다음은 위에서 생성된 인덱스에서 다루는 쿼리의 예입니다.

const query = { title: "Batman" }
const sort = { title: 1 };
const projection = { _id: 0, title: 1 };
const cursor = movies
.find(query)
.sort(sort)
.project(projection);

자세히 알아보려면 단일 필드 인덱스를 참조하세요.

복합 인덱스는 문서의 여러 필드에 대해 오름차순 또는 내림차순 정렬 순서를 지정하는 쿼리의 성능을 개선하는 인덱스입니다. 인덱스의 각 필드에 대해 정렬 방향(오름차순 또는 내림차순)을 지정해야 합니다.

다음 예제에서는 createIndex() 메서드를 사용하여 sample_mflix 데이터베이스의 movies 컬렉션에 있는 typegenre 필드에 복합 인덱스를 생성합니다.

const database = client.db("sample_mflix");
const movies = database.collection("movies");
// Create an ascending index on the "type" and "genre" fields
// in the "movies" collection.
const result = await movies.createIndex({ type: 1, genre: 1 });
console.log(`Index created: ${result}`);

다음은 위에서 생성된 인덱스에서 다루는 쿼리의 예입니다.

const query = { type: "movie", genre: "Drama" };
const sort = { type: 1, genre: 1 };
const projection = { _id: 0, type: 1, genre: 1 };
const cursor = movies
.find(query)
.sort(sort)
.project(projection);

자세히 알아보려면 복합 인덱스를 참조하세요.

다중 키 인덱스는 배열 값을 포함하는 필드에 대한 쿼리의 성능을 향상하는 인덱스입니다.

createIndex() 메서드를 호출하여 배열 값이 있는 필드에 다중 키 인덱스를 생성할 수 있습니다. 다음 코드는 sample_mflix 데이터베이스의 movies 컬렉션에서 cast 필드에 오름차순 인덱스를 생성합니다.

const database = client.db("sample_mflix");
const movies = database.collection("movies");
// Create a multikey index on the "cast" field
const result = await movies.createIndex({ cast: 1 });

다음 코드는 멀티키 인덱스를 쿼리하여 cast 필드 값에 'Viola Davis'가 포함된 문서를 찾습니다:

const query = { cast: "Viola Davis" };
const projection = { _id: 0, cast: 1 , title: 1 };
const cursor = movies
.find(query)
.project(projection);

멀티키 인덱스는 쿼리 커버리지, 인덱스 바운드 계산 및 정렬 동작 측면에서 멀티키가 아닌 인덱스와 다르게 작동합니다. 동작 및 제한 사항에 대한 설명을 포함하여 다중 키 인덱스에 대한 전체 설명은 MongoDB Server 매뉴얼의 다중 키 인덱스 페이지 를 참조하세요.

클러스터형 인덱스클러스터형 컬렉션에서 삽입, 업데이트 및 삭제 작업의 성능을 향상시키는 인덱스입니다. 클러스터형 컬렉션은 클러스터형 인덱스 키 값을 기준으로 정렬된 문서를 저장합니다.

클러스터형 인덱스를 생성하려면 CollectionOptionclusteredIndex 옵션을 지정합니다. clusteredIndex 옵션은 _id 필드를 키로 지정하고 고유 필드를 true로 지정해야 합니다.

다음 예제에서는 createCollection() 메서드를 사용하여 tea 데이터베이스의 vendors 컬렉션에 있는 _id 필드에 클러스터형 인덱스를 생성합니다.

const db = client.db('tea');
await db.createCollection('ratings', {
clusteredIndex: {
key: { _id: 1 },
unique: true
}
});

자세히 알아보려면 클러스터형 인덱스클러스터형 컬렉션을 참조하세요.

텍스트 인덱스는 문자열 콘텐츠에 대한 텍스트 검색 쿼리를 지원합니다. 이러한 인덱스에는 값이 문자열 또는 문자열 요소의 배열인 모든 필드가 포함될 수 있습니다.

MongoDB는 다양한 언어에 대한 텍스트 검색을 지원하므로 인덱스 생성 시 기본 언어를 옵션으로 지정할 수 있습니다. 또한 인덱스의 특정 텍스트 필드에 우선순위를 부여하는 가중치 옵션을 지정할 수도 있습니다. 이 가중치는 인덱싱된 다른 필드와 비교해 봤을 때 해당 필드의 중요성을 나타냅니다.

텍스트 검색에 대해 자세히 알아보려면 텍스트 검색 쿼리에 대한 가이드를 참조하세요.

다음 예시에서는 createIndex() 메서드를 사용하여 다음 조치를 수행합니다:

  • blogPosts collection의 titlebody 필드에 text 인덱스를 생성합니다

  • 기본 언어로 english 지정

  • body의 필드 가중치를 10로, title의 가중치를 3로 설정합니다.

const myDB = client.db("testDB");
const myColl = myDB.collection("blogPosts");
// Create a text index on the "title" and "body" fields
const result = await myColl.createIndex(
{ title: "text", body: "text" },
{ default_language: "english" },
{ weights: { body: 10, title: 3 } }
);

다음 쿼리는 이전 코드에서 생성된 텍스트 인덱스를 사용합니다.

const query = { $text: { $search: "life ahead" } };
const projection = { _id: 0, title: 1 };
const cursor = myColl.find(query).project(projection);

텍스트 인덱스에 대해 자세히 알아보려면 서버 매뉴얼의 텍스트 인덱스를 참조하세요.

MongoDB는 2dsphere 인덱스를 사용하여 지리 공간적 좌표 데이터 쿼리를 지원합니다. 2dsphere 인덱스를 사용하면 지리 공간적 데이터에 포함, 교차 및 근접성 등을 쿼리할 수 있습니다. MongoDB Node.js 드라이버로 지리 공간적 데이터를 쿼리하는 방법에 대한 자세한 내용은 지리 공간적 검색 가이드를 참조하세요.

2dsphere 인덱스를 만들려면 GeoJSON 객체 만 포함하는 필드를 지정해야 합니다. 이 유형에 대한 자세한 내용은 GeoJSON 객체에 대한 MongoDB 서버 매뉴얼 페이지를 참조하세요.

sample_mflix 데이터베이스의 theaters컬렉션에 있는 다음 샘플 문서의 location.geo 필드는 극장의 좌표를 설명하는 GeoJSON 포인트 객체입니다:

{
"_id" : ObjectId("59a47286cfa9a3a73e51e75c"),
"theaterId" : 104,
"location" : {
"address" : {
"street1" : "5000 W 147th St",
"city" : "Hawthorne",
"state" : "CA",
"zipcode" : "90250"
},
"geo" : {
"type" : "Point",
"coordinates" : [
-118.36559,
33.897167
]
}
}
}

다음 예시에서는 createIndexes() 방법을 사용하여 sample_mflix 데이터베이스의 theaters 컬렉션에 있는 location.geo 필드에 2dsphere 인덱스를 생성하여 지리 공간적 검색을 활성화합니다.

const database = client.db("sample_mflix");
const movies = database.collection("movies");
// Create a 2dsphere index on the "location.geo" field in the "theaters" collection.
const result = await movies.createIndex({ "location.geo": "2dsphere" });
console.log(`Index created: ${result}`);

또한 MongoDB는 유클리드 평면에서 거리를 계산하고 MongoDB 2.2 이하에서 사용되는 '레거시 좌표 쌍' 구문으로 작업하기 위한 2d 인덱스를 지원합니다. 자세히 알아보려면 지리 공간적 쿼리를 참조하세요.

고유 인덱스는 인덱싱된 필드에 중복된 값이 저장되지 않도록 합니다. 기본적으로 MongoDB는 컬렉션 생성 시 _id 필드에 고유 인덱스를 생성합니다. 고유 인덱스를 생성하려면 중복을 방지하려는 필드 또는 필드 조합을 지정하고 unique 옵션을 true로 설정합니다.

다음 예시에서는 createIndex() 메서드를 사용하여 sample_mflix 데이터베이스의 theaters 컬렉션에 있는 theaterId 필드에 고유 인덱스을 생성합니다.

const database = client.db("sample_mflix");
const movies = database.collection("movies");
// Create a unique index on the "theaterId" field in the "theaters" collection.
const result = await movies.createIndex({ theaterId: 1 }, { unique: true });
console.log(`Index created: ${result}`);

고유 인덱스를 위반하는 중복 값을 저장하는 쓰기 작업을 시도할 경우, MongoDB는 다음과 같은 오류를 발생시킵니다.

E11000 duplicate key error index

자세한 내용은 고유 인덱스를 참조하세요.

listIndexes() 메서드를 사용하여 컬렉션의 모든 인덱스를 나열할 수 있습니다. listIndexes() 이 메서드는 선택 사항인 ListIndexesOptions 를 사용합니다. 매개변수. listIndexes() 메서드는 ListIndexesCursor 유형의 객체를 반환합니다.

다음 코드는 listIndexes() 메서드를 사용하여 컬렉션의 모든 인덱스를 나열합니다.

const result = await collection.listIndexes().toArray();
console.log("Existing indexes:\n");
for(const doc in result){
console.log(doc);
}
← 트랜잭션