MongoDB — 문서 데이터베이스의 판단 · 문서 모델과 실행 계획 · 이론
느린 이유는 대개 인덱스다
한 줄 요약
인덱스가 없으면 문서 DB 도 전부 훑는다. COLLSCAN 이라고 적힌다. RDB 의
Seq Scan 과 정확히 같은 것이고, 대책도 같다.
왜 필요한가 — 느린 이유는 대개 하나다
"MongoDB 가 느리다" 는 신고의 대부분은 데이터베이스가 아니라 **인덱스가 없는
조회**다. 문서가 만 건일 때는 아무도 모른다. 백만 건이 되면 같은 코드가
갑자기 느려지고, 그때 사람들은 데이터베이스를 의심한다.
확인하는 방법은 RDB 와 같다. 계획을 물어본다.
db.items.find({ name: "빨간 배낭" }).explain()계획 안에서 볼 단어는 둘뿐이다. COLLSCAN 이면 전부 훑은 것이고, IXSCAN
이면 인덱스를 탄 것이다.
숫자를 함께 본다
단계 이름만으로는 절반이다. explain('executionStats') 를 쓰면 실제로
몇 건을 훑었는지가 나온다.
| 값 | 뜻 |
|---|---|
| nReturned | 실제로 돌려준 문서 수 |
| totalDocsExamined | 그것을 찾으려고 열어 본 문서 수 |
이 둘의 비율이 인덱스의 성적표다. 한 건을 돌려주려고 백만 건을 열었다면
인덱스가 없거나 잘못 걸린 것이다. 반대로 둘이 비슷하면 잘 걸린 것이다.
현장에서
인덱스를 더 만드는 것이 늘 답은 아니다. 인덱스는 **쓰기를 느리게 하고
공간을 먹는다.** 문서를 하나 넣을 때마다 모든 인덱스가 갱신된다.
그래서 순서가 있다. 먼저 계획을 읽어 무엇이 느린지 확인하고, 그다음 그
조회 하나를 위한 인덱스를 만든다. "혹시 몰라서" 만든 인덱스는 쓰기 비용만
남기고 아무 조회도 빠르게 하지 않는 경우가 많다.
이 순서를 지키는지가 SQL 최적화 경험을 묻는 면접에서 갈리는 지점이다.