MongoDB - 인덱싱 제한 사항
안녕하세요, 미래의 데이터베이스 마법사 여러분! 오늘 우리는 MongoDB 인덱싱 제한 사항에 대해 흥미로운 세상으로 뛰어들어 보겠습니다. 지금 당신이 떠올리는 것은 "제한 사항? 그것은 매우 흥미롭지 않아 보이네!"일 것입니다. 하지만 믿으세요, 이러한 제한 사항을 이해하는 것은 MongoDB 마스터가 되는 데 필수적입니다. 그럼 이 모험을 함께 시작해 보겠습니다!
추가 오버 헤드
MongoDB에서 인덱싱에 대해 이야기할 때, 그것은 마치 초조된 도서관 목록을 만드는 것과 같습니다. 빠르게 것을 찾아주는 데 도움이 되지만, 추가적인 작업이 필요합니다. 이를 구분해 보겠습니다:
인덱싱 오버 헤드는 무엇인가요?
인덱싱 오버 헤드는 MongoDB에서 인덱스를 유지하기 위해 필요한 추가 자원과 연산을 의미합니다. 마치 도서가 도착하거나 떠날 때마다 목록을 지속적으로 업데이트해야 하는 도서관 사서와 같습니다.
왜 중요한가요?
-
쓰기 연산: 문서를 삽입하거나 업데이트하거나 삭제할 때마다 MongoDB는 해당 인덱스를 업데이트해야 합니다. 이는 쓰기 연산을 늦출 수 있습니다.
-
저장 공간: 인덱스는 추가적인 디스크 공간을 차지하며, 큰 컬렉션의 경우 빠르게 쌓일 수 있습니다.
-
메모리 사용: 인덱스는 빠른 액세스를 위해 RAM에 유지되며, 이는 다른 연산에 사용할 수 있는 메모리를 줄입니다.
간단한 예제를 보겠습니다:
db.books.createIndex({ title: 1 })
db.books.insert({ title: "MongoDB for Beginners", author: "Jane Doe" })
이 경우 MongoDB는 문서를 삽입하는 것뿐만 아니라 "title" 필드에 대한 인덱스를 업데이트합니다. 컬렉션이 커지면서 이 오버 헤드는 더욱 두드러지게 나타납니다.
RAM 사용량
이제 RAM 사용량에 대해 이야기해 보겠습니다. RAM을 큰 데스크로 생각해 보세요. MongoDB가 모든 작업을 수행하는 곳입니다. 많은 인덱스를 가지면 다른 작업을 위한 공간이 줄어듭니다.
왜 RAM 사용량이 중요한가요?
-
성능: MongoDB는 인덱스를 RAM에 유지하여 쿼리를 빠르게 처리하려고 합니다. 인덱스가 RAM에 맞지 않으면 성능이 크게 저하될 수 있습니다.
-
자원 관리: 인덱스에 의한 과도한 RAM 사용은 다른 데이터베이스 연산이나 동일한 서버에 있는 다른 애플리케이션에 사용할 수 있는 메모리를 줄입니다.
다음 표는 다양한 인덱스 유형이 RAM 사용량에 미치는 영향을 보여줍니다:
인덱스 유형 | RAM 사용량 |
---|---|
단일 필드 | 중간 |
복합 | 높음 |
텍스트 | 높음 |
지리 공간 | 매우 높음 |
인덱스 크기를 확인하려면 다음 명령어를 사용할 수 있습니다:
db.collection.stats().indexSizes
기억하세요, 모든 것은 균형에 달려 있습니다. 쿼리를 빠르게 처리하기 위한 충분한 인덱스를 원하지만, RAM을 모두 차지하지 않도록 주의해야 합니다!
쿼리 제한 사항
좋아요, 이제 흥미로운 부분으로 넘어가겠습니다 - 쿼리 제한 사항. 인덱스가 있더라도 MongoDB가 매우 효율적으로 수행할 수 없는 일부 작업이 있습니다.
여러 필드에 대한 불평등 필터
MongoDB는 쿼리에서 불평등 필터(예: $gt
, $lt
등)를 단일 필드에 대해만 효율적으로 인덱스를 사용할 수 있습니다. 예를 들어:
// 이 쿼리는 인덱스를 효율적으로 사용할 수 있습니다
db.products.find({ price: { $gt: 100 }, category: "electronics" })
// 이 쿼리는 인덱스를 효율적으로 사용하지 않을 수 있습니다
db.products.find({ price: { $gt: 100 }, quantity: { $lt: 20 } })
두 번째 쿼리의 경우, MongoDB는 price
인덱스와 quantity
인덱스 중 하나를 선택할 수 있지만, 범위 쿼리에 대해 동시에 사용할 수는 없습니다.
부정 연산자
부정 연산자(예: $ne
, $not
, $nin
등)를 사용하는 쿼리는 종종 인덱스를 효율적으로 사용할 수 없습니다. 예를 들어:
// 이 쿼리는 인덱스를 효율적으로 사용하지 않을 수 있습니다
db.users.find({ age: { $ne: 30 } })
MongoDB는 모든 문서를 스캔하여 조건을 만족하지 않는 문서를 찾아야 하므로, 큰 컬렉션의 경우 느려질 수 있습니다.
인덱스 키 크기 제한
이제 인덱스 키 크기 제한에 대해 이야기해 보겠습니다. MongoDB는 인덱스 키 크기에 대해 몇 가지 제약을 가지고 있습니다.
최대 인덱스 키 크기
MongoDB에서 인덱스 키의 최대 크기는 1024 바이트입니다. 이는 많이 보일 수 있지만, 복합 인덱스나 큰 문자 필드를 인덱스할 때 제한이 될 수 있습니다.
예를 들어, 자주 이 limit을 초과하는 필드에 대해 인덱스를 만들려고 할 때:
db.posts.createIndex({ "longTextField": 1 })
이 경우 오류가 발생하거나 문서가 인덱스에 포함되지 않을 수 있습니다.
인덱스 키 크기 초과 시 문서 삽입
문서를 삽입할 때 인덱스 키가 1024 바이트를 초과하는 필드를 가지면 어떻게 될까요? 알아보겠습니다!
삽입 시 행동
문서를 삽입할 때 인덱스 키가 1024 바이트를 초과하는 경우 MongoDB는 문서를 삽입하지만, 해당 인덱스에 대한 인덱스 항목을 생성하지 않습니다.
예를 들어:
db.collection.createIndex({ "description": 1 })
db.collection.insert({ "description": "This is a very, very long description..." }) // 상상해 보세요, 이는 1024 바이트를 초과합니다
문서는 삽입되지만, "description" 필드에 대한 인덱스 항목은 생성되지 않습니다. 이는 해당 인덱스를 사용한 쿼리에서 문서를 찾지 못하게 됩니다.
결과
- 불완전한 쿼리 결과: 인덱스를 사용한 쿼리는 인덱스 키 크기를 초과하는 문서를 건너뛰게 됩니다.
- 비기대한 행동: 애플리케이션이 모든 문서가 인덱스에 포함되어 있다고 가정할 경우 버그가 발생할 수 있습니다.
- 성능 문제: 인덱스에 포함되지 않은 문서는 MongoDB가 컬렉션을 스캔해야 하므로 성능이 저하될 수 있습니다.
최대 범위
마지막으로, MongoDB 인덱싱의 최대 범위에 대해 이야기해 보겠습니다.
최대 범위는 무엇인가요?
MongoDB에서 "범위"는 일반적으로 쿼리의 값 범위를 의미합니다. 예를 들어, $10에서 $50 사이의 가격을 가진 제품을 찾는 것입니다. "최대 범위" 제한은 MongoDB가 한 번의 쿼리에서 몇 개의 범위를 효율적으로 사용할 수 있는지를 의미합니다.
다중 범위 제한
MongoDB는 한 번의 쿼리에서 최대 한 개의 범위 조건을 효율적으로 사용할 수 있습니다. 추가적인 범위 조건은 인덱스를 효율적으로 사용하지 않을 수 있습니다.
예를 들어:
// 이 쿼리는 인덱스를 효율적으로 사용할 수 있습니다
db.products.find({ price: { $gte: 10, $lte: 50 }, category: "electronics" })
// 이 쿼리는 인덱스를 효율적으로 사용하지 않을 수 있습니다
db.products.find({
price: { $gte: 10, $lte: 50 },
rating: { $gte: 4, $lte: 5 },
category: "electronics"
})
두 번째 쿼리의 경우, MongoDB는 price
범위와 rating
범위 중 하나를 선택할 수 있지만, 동시에 사용할 수는 없습니다.
回避 방법
이 제한을回避하려면 다음과 같은 방법을 사용할 수 있습니다:
-
$or
를 사용하여 쿼리를 여러 부분으로 나누어 각 부분에 대해 다른 인덱스를 사용합니다. - 관련 필드를 재설계하여 결합합니다.
- 복합 인덱스를 전략적으로 사용합니다.
예를 들어:
db.products.find({
$or: [
{ price: { $gte: 10, $lte: 50 } },
{ rating: { $gte: 4, $lte: 5 } }
],
category: "electronics"
})
이 쿼리 구조는 각 $or
조건 부분에 대해 MongoDB가 별도의 인덱스를 사용할 수 있도록 합니다.
그럼 여러분, MongoDB 인덱싱 제한 사항에 대해 배웠습니다. 이 것들은 장애물이 아니라, 우리가 더 효율적이고 확장 가능한 데이터베이스를 구축하는 데 가이드를 제공하는 표지입니다. 계속 실험하고, 배우고, 가장 중요한 것은 지혜롭게 인덱싱하십시오!
Credits: Image by storyset