인프런 커뮤니티 질문&답변

ygh님의 프로필 이미지
ygh

작성한 질문수

mongoDB 기초부터 실무까지(feat. Node.js)

index 성능 테스트하기

안녕하세요! 질문있습니다.

해결된 질문

작성

·

331

1

안녕하세요. 좋은 강의 감사드립니다 :)

몽고디비 index 관련해서 궁금한 사항이 생겨 질문드립니다.

mysql 같은경우에 index를 통한 조회는 disk로 부터 하나의 data block을 fetching하는 single block I/O가 발생하기 때문에 전체 데이터에서 조회하고자 하는 데이터가 많을 경우에는 index를 통한 조회가 full scan보다 오히려 성능적으로 악화되는 구간이 존재하므로 무조건 index를 거는것이 성능에 이점을 주지 않을수도 있다고 알고있는데요. 몽고디비의 index도 동일하다고 생각하면 되는 걸까요?

답변 1

0

ygh님 안녕하세요 :)

ygh님 말씀하신대로 그럴 수도 있지만 차이는 별로 크지 않을거에요. 서버가 켜지면 디스크에 저장되었던 인덱스들을 불러와서 메모리에 올려놔요. 따라서 index를 조회하는건 메모리를 통해서 진행되기 때문에 디스크에서 데이터를 읽어드리는 시간보다 훨씬 짧죠. 2번의 I/O가 발생하기 보다는 체감상 1.1 I/O가 발생하는 느낌이지 않을까 싶어요. 

그리고 데이터가 적다면 애초에 인덱스가 없어도 됩니다. 인덱스는 데이터가 많아졌을 때 어떤 쿼리들이 왜 오래 걸리는지 분석해보시고 적용하면 되요.

ygh님의 프로필 이미지
ygh
질문자

답변 감사드립니다 :)

다만, 제가 질문을 좀 모호하게 해서 그런지 원하는 답변을 얻지는 못했는데요.

mysql 같은 경우에는 위와 같이 index scan은 single block (disk에서 buffer pool로 한번에 로딩하는 데이터 단위) I/O가 발생하는 반면 full scan 같은 경우에는 multi block I/O가 발생한다고 배웠습니다. 그래서 아래와 같은 그래프가 나타나고 손익분기점을 고려하여 index를 설계해야 한다고 배웠습니다.

즉, 몽고디비에서 index에서도 mysql의 index와 같은 방식의 disk I/O가 발생하는지 궁금해서 질문드렸습니다 :)

아 질문을 잘못 이해했었네요.

ygh님께서 말씀하신 내용이 맞습니다! 몽고디비, mysql뿐만 아니라 다른 데이터베이스도 동일할거에요.

강의 내용에서 selectivity를 다루었는데요. 이 경우 selectivity가 매우 안좋다고 할 수 있어요. Selectivity가 높은(많은 데이터에서 원하는 소수의 데이터를 뻐르게 탐색) 경우에 인덱스를 걸어주는게 좋아요.

ygh님의 프로필 이미지
ygh
질문자

답변 감사합니다. 궁금한 점이 해결됐습니다 :)

ygh님의 프로필 이미지
ygh

작성한 질문수

질문하기