몽고DB의 커스텀 인덱스(custom index)는 어떻게 생성하나요?
_____커스텀 인덱스는 기본 인덱스 외에 사용자가 특정 쿼리 성능을 향상시키기 위해 직접 정의하는 인덱스입니다. 필드 조합, 인덱스 타입(일반, 복합, 텍스트, 해시 등)을 지정해 특정 요구에 맞춘 인덱스를 만들 수 있습니다.
Q2: 몽고DB에서 커스텀 인덱스를 생성하는 기본 명령어는 무엇인가요?
`db.collection.createIndex()` 메서드를 사용합니다. 예:
```js
db.collection.createIndex({ field1: 1, field2: -1 })
```
여기서 `1`은 오름차순, `-1`은 내림차순 인덱스를 의미합니다.
Q3: 단일 필드 대신 여러 필드에 대한 복합 인덱스는 어떻게 만드나요?
`createIndex` 함수에 여러 필드를 객체로 지정하면 됩니다. 예:
```js
db.collection.createIndex({ name: 1, age: -1 })
```
이 인덱스는 name은 오름차순, age는 내림차순으로 정렬됩니다.
Q4: 텍스트 검색을 위한 텍스트 인덱스는 어떻게 생성하나요?
텍스트 인덱스는 문자열 필드에서 텍스트 검색을 가능하게 합니다. 생성 예:
```js
db.collection.createIndex({ description: "text" })
```
Q5: 유니크(unique) 인덱스를 생성하려면 어떻게 해야 하나요?
`createIndex`에 옵션으로 `{ unique: true }`를 전달합니다. 예:
```js
db.collection.createIndex({ email: 1 }, { unique: true })
```
Q6: 해시 인덱스는 어떻게 생성하나요?
```js
db.collection.createIndex({ userId: "hashed" })
```
Q7: 부분 인덱스(partial index)를 생성하는 법은?
특정 조건에 만족하는 문서만 인덱싱하도록 생성합니다. 예:
```js
db.collection.createIndex(
{ status: 1 },
{ partialFilterExpression: { status: { $eq: "active" } } }
)
```
Q8: 생성 시 인덱스 이름을 직접 지정할 수 있나요?
네, options 객체에 `name` 필드를 추가하면 됩니다. 예:
```js
db.collection.createIndex({ username: 1 }, { name: "custom_index_name" })
```
Q9: 커스텀 인덱스 생성 전 고려할 점은 무엇인가요?
- 인덱스는 쓰기 작업 성능에 영향을 줄 수 있으므로 빈번한 쓰기 작업이 있는지 고려해야 합니다.
- 쿼리 패턴에 적합한 필드를 선택하는 것이 중요합니다.
- 중복 데이터를 허용하지 않으려면 `unique` 옵션 사용 시 주의해야 합니다.
Q10: 몽고DB 셸 외에 다른 방법으로 인덱스 생성이 가능한가요?
네, 드라이버(예: Node.js, Python 등)의 `createIndex` API를 통해서도 동일하게 생성할 수 있습니다.
---
요약: 몽고DB에서 커스텀 인덱스는 `db.collection.createIndex()` 메서드를 이용해 필드와 옵션을 지정하여 생성하며, 복합 인덱스, 텍스트 인덱스, 유니크 인덱스 등 다양한 유형과 조건으로 정의 가능합니다.
인덱스는 특정 필드에 대한 검색을 빠르게 수행할 수 있도록 도와주며, 특히 대량의 데이터가 있는 경우 그 중요성이 더욱 커집니다.
MongoDB에서는 다양한 유형의 인덱스를 지원하며, 이를 통해 사용자의 요구에 맞는 인덱스를 생성할 수 있습니다.
다음은 MongoDB에서 커스텀 인덱스를 생성하는 방법에 대한 자세한 설명입니다.
1. 인덱스의 필요성 이해하기 인덱스는 데이터베이스의 특정 필드에 대한 검색 성능을 향상시키는 데 사용됩니다.
예를 들어, 대량의 문서가 있는 컬렉션에서 특정 필드에 대해 자주 쿼리를 수행하는 경우, 해당 필드에 인덱스를 생성하면 쿼리 성능이 크게 향상될 수 있습니다.
인덱스는 데이터베이스의 성능을 최적화하는 데 중요한 역할을 합니다.
2. 인덱스 생성하기 MongoDB에서 인덱스를 생성하는 방법은 다음과 같습니다: a. 기본 인덱스 생성 가장 기본적인 인덱스는 단일 필드 인덱스입니다.
예를 들어, `users` 컬렉션의 `username` 필드에 인덱스를 생성하려면 다음과 같은 명령어를 사용할 수 있습니다: ```javascript db.users.createIndex({ username: 1 }) ``` 여기서 `1`은 오름차순 인덱스를 의미합니다.
내림차순 인덱스를 원할 경우 `-1`을 사용합니다.
b. 복합 인덱스 생성 복합 인덱스는 두 개 이상의 필드에 대해 인덱스를 생성하는 것입니다.
예를 들어, `users` 컬렉션의 `firstName`과 `lastName` 필드에 대해 복합 인덱스를 생성하려면 다음과 같이 합니다: ```javascript db.users.createIndex({ firstName: 1, lastName: 1 }) ``` 이 경우, `firstName`과 `lastName`의 조합으로 인덱스가 생성됩니다.
c. 고유 인덱스 생성 고유 인덱스는 인덱스가 적용된 필드의 값이 중복되지 않도록 보장합니다.
예를 들어, `email` 필드에 대해 고유 인덱스를 생성하려면 다음과 같이 합니다: ```javascript db.users.createIndex({ email: 1 }, { unique: true }) ``` 이렇게 하면 동일한 이메일 주소를 가진 두 개의 문서가 존재할 수 없게 됩니다.
d. 복합 고유 인덱스 생성 여러 필드에 대해 고유 인덱스를 생성할 수도 있습니다.
예를 들어, `firstName`과 `lastName`의 조합이 고유해야 하는 경우 다음과 같이 생성할 수 있습니다: ```javascript db.users.createIndex({ firstName: 1, lastName: 1 }, { unique: true }) ```
3. 인덱스 옵션 MongoDB에서는 인덱스를 생성할 때 다양한 옵션을 설정할 수 있습니다.
주요 옵션은 다음과 같습니다: - sparse : 이 옵션을 사용하면 인덱스가 없는 문서에 대해서는 인덱스를 생성하지 않습니다.
예를 들어, 특정 필드가 없는 문서가 많을 경우 이 옵션을 사용할 수 있습니다.
```javascript db.users.createIndex({ username: 1 }, { sparse: true }) ``` - expireAfterSeconds : TTL(Time To Live) 인덱스를 생성하여 일정 시간이 지난 후 문서를 자동으로 삭제할 수 있습니다.
예를 들어, `createdAt` 필드에 대해 3600초 후에 문서를 삭제하려면 다음과 같이 합니다: ```javascript db.users.createIndex({ createdAt: 1 }, { expireAfterSeconds: 3600 }) ```
4. 인덱스 확인 및 관리 생성된 인덱스를 확인하려면 다음과 같은 명령어를 사용합니다: ```javascript db.users.getIndexes() ``` 이 명령어는 해당 컬렉션에 생성된 모든 인덱스의 정보를 반환합니다.
인덱스를 삭제하려면 다음과 같이 합니다: ```javascript db.users.dropIndex("indexName") ``` 여기서 `indexName`은 삭제할 인덱스의 이름입니다.
5. 인덱스 성능 모니터링 MongoDB는 인덱스의 성능을 모니터링할 수 있는 다양한 도구를 제공합니다.
`explain()` 메서드를 사용하여 쿼리의 실행 계획을 확인하고, 인덱스가 실제로 사용되고 있는지 확인할 수 있습니다.
예를 들어: ```javascript db.users.find({ username: "john" }).explain("executionStats") ``` 이 명령어는 쿼리의 실행 계획과 성능 통계를 보여줍니다.
결론 MongoDB에서 커스텀 인덱스를 생성하는 것은 데이터베이스 성능을 최적화하는 데 매우 중요합니다.
다양한 유형의 인덱스를 활용하여 쿼리 성능을 향상시키고, 데이터의 무결성을 유지할 수 있습니다.
인덱스 생성 시 적절한 옵션을 선택하고, 생성한 인덱스의 성능을 모니터링하여 데이터베이스를 효율적으로 관리하는 것이 중요합니다.
작성자:
최재호 [비회원]
| 작성일자: 1년 전
2024-09-09 18:16:28
조회수: 155 | 댓글: 0 | 좋아요: 0 | 싫어요: 0
조회수: 155 | 댓글: 0 | 좋아요: 0 | 싫어요: 0
내용이 부정확하다면 싫어요를 클릭해주세요.