Indexes
이 페이지의 내용
개요
인덱스는 MongoDB에서 효율적인 쿼리 실행을 지원하는 데이터 구조입니다. 문서에 데이터 일부의 사본이 포함되어 있어 쿼리를 보다 효율적으로 수행할 수 있습니다.
인덱스가 없으면 MongoDB는 컬렉션의 모든 문서를 스캔하여 각 쿼리와 일치하는 문서를 찾아야 합니다. 이러한 컬렉션 스캔은 속도가 느리고 애플리케이션 성능에 부정적인 영향을 미칠 수 있습니다. 인덱스를 사용하여 MongoDB가 스캔하는 문서 수를 제한하면 쿼리를 더욱 효율적으로 수행하고 결과를 더 빨리 반환할 수 있습니다.
쿼리 커버리지 및 성능
MongoDB에 대해 쿼리를 실행할 때 쿼리에는 다음 세 부분이 포함될 수 있습니다.
찾고 있는 하나 이상의 필드와 값을 지정하는 쿼리 기준
쿼리 실행에 영향을 주는 옵션(예: 읽기 고려)
MongoDB가 반환할 필드를 지정하기 위한 프로젝션 기준(선택 사항)
쿼리 기준 및 쿼리 프로젝션에 지정된 모든 필드가 인덱싱되면 MongoDB는 컬렉션의 문서를 스캔하거나 메모리에 로드하지 않고 인덱스에서 직접 결과를 반환합니다.
인덱스가 쿼리 기준 및 프로젝션을 커버하도록 하는 방법에 대한 자세한 내용은 쿼리 커버리지 및 인덱스 교차에 대한 MongoDB 매뉴얼 문서를 참조하세요.
운영 고려 사항
쿼리 성능을 향상시키려면 애플리케이션의 쿼리와 정렬된 결과를 반환하는 작업에 자주 나타나는 필드에 인덱스를 빌드합니다. 추가하는 각 인덱스는 활성화되면 디스크 공간과 메모리를 사용하므로 용량 계획을 위해 인덱스 메모리와 디스크 사용량을 추적해야 할 수 있습니다. 또한 쓰기 (write) 작업이 인덱싱된 필드를 업데이트할 때는 MongoDB도 관련 인덱스를 업데이트해야 합니다.
데이터 모델을 설계하고 애플리케이션에 적합한 인덱스를 선택하는 방법에 대한 자세한 내용은 인덱싱 전략 및 데이터 모델링 및 인덱스에 대한 MongoDB Server 문서를 참조하세요.
인덱스 나열
메서드를 사용하여 컬렉션 의 모든 인덱스를 나열할 수 listIndexes()
있습니다. listIndexes() 이 메서드는 선택 사항인 ListIndexesOptions 를 사용합니다. 매개변수.listIndexes()
메서드는 ListIndexesCursor 유형의 객체 를 반환합니다.
다음 코드는 listIndexes()
메서드를 사용하여 컬렉션의 모든 인덱스를 나열합니다.
// List the indexes on the collection and output them as an array const result = await collection.listIndexes().toArray(); // Print the list of indexes console.log("Existing indexes:\n"); for(const doc in result){ console.log(doc); }
인덱스 유형
MongoDB는 데이터 쿼리를 지원하기 위해 여러 가지 인덱스 유형을 지원합니다. 다음 섹션에서는 가장 일반적인 인덱스 유형을 설명하고 각 인덱스 유형을 생성하기 위한 샘플 코드를 제공합니다.
단일 필드 인덱스
단일 필드 인덱스는 문서의 단일 필드에 오름차순 또는 내림차순 정렬 순서를 지정하는 쿼리의 성능을 향상시키는 인덱스입니다.
다음 예제에서는 createIndex()
메서드를 사용하여 sample_mflix
데이터베이스의 movies
컬렉션에 있는 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}`);
다음은 위에서 생성된 인덱스에서 다루는 쿼리의 예시입니다.
// Define the query parameters const query = { title: "Batman" } const sort = { title: 1 }; const projection = { _id: 0, title: 1 }; // Execute the query using the defined parameters const cursor = movies .find(query) .sort(sort) .project(projection);
자세히 알아보려면 단일 필드 인덱스를 참조하세요.
복합 인덱스
복합 인덱스는 문서의 여러 필드에 대해 오름차순 또는 내림차순 정렬 순서를 지정하는 쿼리의 성능을 개선하는 인덱스입니다. 인덱스의 각 필드에 대해 정렬 방향(오름차순 또는 내림차순)을 지정해야 합니다.
다음 예제에서는 createIndex()
메서드를 사용하여 sample_mflix
데이터베이스의 movies
컬렉션에 있는 type
및 genre
필드에 복합 인덱스를 생성합니다.
// Connect to the "sample_mflix" database const database = client.db("sample_mflix"); // Access the database's "movies" collection 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}`);
다음은 위에서 생성된 인덱스에서 다루는 쿼리의 예시입니다.
// Define a query to find movies in the "Drama" genre const query = { type: "movie", genre: "Drama" }; // Define sorting criteria for the query results const sort = { type: 1, genre: 1 }; // Include only the type and genre fields in the query results const projection = { _id: 0, type: 1, genre: 1 }; // Execute the query using the defined criteria and projection 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 in the "movies" collection const result = await movies.createIndex({ cast: 1 });
다음 코드는 다중 키 인덱스를 쿼리하여 cast
필드 값에 "Viola Davis"
이 포함된 문서를 찾습니다.
const query = { cast: "Viola Davis" }; const projection = { _id: 0, cast: 1 , title: 1 }; // Perform a find operation with the preceding filter and projection const cursor = movies .find(query) .project(projection);
멀티키 인덱스는 쿼리는 쿼리 커버리지, 인덱스 바운드 계산, 정렬 행동 등에서 비멀티키 인덱스와 다르게 작동합니다. 동작과 한계에 대한 설명 등 다중 키 인덱스에 대한 자세한 설명을 확인하고 싶다면 MongoDB 서버 매뉴얼의 멀티키 인덱스 페이지를 참조하세요.
클러스터화된 인덱스
클러스터형 인덱스는 클러스터형 컬렉션에서 삽입, 업데이트 및 삭제 작업의 성능을 향상시키는 인덱스입니다. 클러스터형 컬렉션은 클러스터형 인덱스 키 값을 기준으로 정렬된 문서를 저장합니다.
클러스터형 인덱스를 생성하려면 CollectionOption
에 clusteredIndex
옵션을 지정합니다. clusteredIndex
옵션은 _id
필드를 키로 지정하고 고유 필드를 true
로 지정해야 합니다.
다음 예제에서는 createCollection()
메서드를 사용하여 tea
데이터베이스의 vendors
컬렉션에 있는 _id
필드에 클러스터형 인덱스를 생성합니다.
const db = client.db('tea'); await db.createCollection('ratings', { clusteredIndex: { key: { _id: 1 }, unique: true } });
Text Indexes
텍스트 인덱스는 문자열 콘텐츠에 대한 텍스트 검색 쿼리를 지원합니다. 이러한 인덱스에는 값이 문자열 또는 문자열 요소의 배열인 모든 필드가 포함될 수 있습니다.
MongoDB는 다양한 언어에 대한 텍스트 검색을 지원하므로 인덱스 생성 시 기본 언어를 옵션으로 지정할 수 있습니다. 또한 인덱스의 특정 텍스트 필드에 우선순위를 부여하는 가중치 옵션을 지정할 수도 있습니다. 이 가중치는 인덱싱된 다른 필드와 비교해 봤을 때 해당 필드의 중요성을 나타냅니다.
텍스트 검색에 대해 자세히 알아보려면 텍스트 검색 쿼리에 대한 가이드를 참조하세요.
다음 예시에서는 createIndex()
메서드를 사용하여 다음 조치를 수행합니다:
blogPosts
collection의title
및body
필드에text
인덱스를 생성합니다기본 언어로
english
지정body
의 필드 가중치를10
로,title
의 가중치를3
로 설정합니다.
// Get the database and collection on which to create the index 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 } } );
다음 쿼리는 이전 코드에서 생성된 텍스트 인덱스를 사용합니다.
// Query for documents where body or title contain "life ahead" const query = { $text: { $search: "life ahead" } }; // Show only the title field const projection = { _id: 0, title: 1 }; // Execute the find operation const cursor = myColl.find(query).project(projection);
텍스트 인덱스에 대해 자세히 알아보려면 서버 매뉴얼의 텍스트 인덱스를 참조하세요.
지리 공간적 인덱스
MongoDB는 2dsphere 인덱스를 사용하여 지리 공간적 좌표 데이터 쿼리를 지원합니다. 2dsphere 인덱스를 사용하면 지리 공간적 데이터에 포함, 교차 및 근접성 등을 쿼리할 수 있습니다. MongoDB Node.js 드라이버로 지리 공간적 데이터를 쿼리하는 방법에 대한 자세한 내용은 지리 공간적 검색 가이드를 참조하세요.
2dsphere 인덱스를 만들려면 GeoJSON 객체만을 포함하는 필드를 지정해야 합니다. 이 유형에 대한 자세한 내용은 GeoJSON 객체에 대한 MongoDB Server 매뉴얼 페이지를 참조하세요.
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 "movies" collection */ const result = await movies.createIndex({ "location.geo": "2dsphere" }); // Print the result of the index creation console.log(`Index created: ${result}`);
또한 MongoDB는 유클리드 평면에서 거리를 계산하고 MongoDB 2.2 이하에서 사용되는 '레거시 좌표 쌍' 구문으로 작업하기 위한 2d
인덱스를 지원합니다. 자세히 알아보려면 지리 공간적 쿼리를 참조하세요.
Unique Indexes
고유 인덱스는 인덱싱된 필드에 중복된 값이 저장되지 않도록 합니다. 기본적으로 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
자세한 내용은 고유 인덱스를 참조하세요.
검색 인덱스
Atlas Search는 전체 텍스트 검색을 수행할 수 있는 기능입니다. 자세히 알아보려면 Atlas Search 문서를 참조하세요.
Atlas collection에서 검색을 수행하려면 먼저 collection에 Atlas Search 인덱스를 생성해야 합니다. Atlas Search 인덱스는 데이터를 검색 가능한 형식으로 분류하는 데이터 구조입니다.
다음 메서드를 사용하여 Search 인덱스를 관리할 수 있습니다:
createSearchIndex()
createSearchIndexes()
listSearchIndexes()
updateSearchIndex()
dropSearchIndex()
다음 섹션에서는 위의 각 메서드를 사용하여 Search 인덱스를 관리하는 코드 샘플을 제공합니다.
검색 인덱스 만들기
createSearchIndex() 및 createSearchIndexes() 메서드를 사용하여 새 검색 인덱스를 만들 수 있습니다.
다음 코드는 createSearchIndex()
메서드를 사용하여 search1
인덱스를 만드는 방법을 보여 줍니다:
// Create a search index const index1 = { name: "search1", definition: { "mappings": { "dynamic": true } } } await collection.createSearchIndex(index1);
MongoDB Server v6.0.11 이상 v6 버전 또는 v7.0.2. 이상 v7 버전에 연결할 때 드라이버를 사용하여 컬렉션에 Atlas Vector Search 인덱스를 생성할 수 있습니다. Atlas Vector Search 문서에서 이 기능에 대해 자세히 알아보세요.
다음 코드에서는 createSearchIndex()
메서드를 사용하여 type
필드가 vectorSearch
인 검색 인덱스를 만드는 방법을 보여 줍니다.
// Create a Vector Search index const vectorSearchIdx = { name: "vsidx1", type: "vectorSearch", definition: { fields: [{ type: "vector", numDimensions: 384, path: "summary", similarity: "dotProduct" }] } } await collection.createSearchIndex(vectorSearchIdx);
검색 인덱스 나열
listSearchIndexes() 메서드를 사용하여 지정된 컬렉션의 검색 인덱스가 포함된 커서를 반환할 수 있습니다. listSearchIndexes()
메서드는 선택적인 문자열 매개변수인 name
을 사용하여 이름이 일치하는 인덱스만 반환합니다. 또한 선택 사항인 aggregateOptions 매개변수도 필요합니다.
다음 코드는 listSearchIndexes()
메서드를 사용하여 컬렉션의 모든 검색 인덱스를 나열합니다.
// List search indexes const result = await collection.listSearchIndexes().toArray(); console.log("Existing search indexes:\n"); for (const doc in result) { console.log(doc); }
검색 인덱스 업데이트
updateSearchIndex() 메서드를 사용하여 검색 인덱스를 업데이트할 수 있습니다.
다음 코드는 updateSearchIndex()
메서드를 사용하여 search1
이라는 인덱스를 업데이트하여 description
필드에 문자열 유형을 지정하는 방법을 보여 줍니다.
// Update a search index const index2 = { "mappings": { "dynamic": true, "fields": { "description": { "type": "string" } } } } await collection.updateSearchIndex("search1", index2);
검색 인덱스 제거
dropSearchIndex() 메서드를 사용하여 검색 인덱스를 제거할 수 있습니다.
다음 코드는 dropSearchIndex()
메서드를 사용하여 search1
인덱스를 제거하는 방법을 보여 줍니다:
// Dropping (deleting) a search index await collection.dropSearchIndex("search1");