인덱스를 사용하지 않아야 할 때

2023. 4. 8. 13:07DB/MongoDB

인덱스를 사용하지 않아야 할 때

실무에서 인덱스를 사용했을 때 컬렉션 스캔보다 속도가 느린 경우가 있었습니다. 인덱스를 걸면 수정, 삭제를 제외하곤 성능이 좋아져야 맞다고 생각했기에 의아했습니다.

원인은 인덱스로 생성한 필드가 중복이 많아 가져오는 도큐먼트가 많다는 것이었습니다.

OREILLY 사의 몽고DB 완벽 가이드 책에 따르면 인덱스는 데이터 일부를 조회할 때 가장 효율적이며 어떤 쿼리는 인덱스가 없는 게 더 빠르다고 합니다. 인덱스는 컬렉션에서 가져와야 하는 부분이 많을수록 비효율적인데, 인덱스를 하나 사용하려면 두 번의 조회를 해야하기 때문입니다. 한 번은 인덱스 항목을 살펴보고, 또 한 번은 도큐먼트를 가리키는 인덱스의 포인터를 따라갑니다. 반만에 컬렉션 스캔을 할 때는 도큐먼트만 살펴보면 됩니다. 최악의 경우 (컬렉션의 모든 도큐먼트를 반환해야 할 때) 인덱스를 사용하면 두 배나 많은 조회를 수행하며 이는 대체로 컬렉션 스캔보다 훨씬 느립니다.

두 번의 조회란, 1) 인덱스 항목을 살펴보고 2) 도큐먼트를 가리키는 인덱스의 포인터를 따라갑니다.

1) 인덱스 항목

쿼리에 적용할 수 있는 인덱스가 있는지 탐색합니다.

2) 인덱스 포인터

인덱스에 저장된 도큐먼트를 참조하고 있는 정보입니다.


mongoDB 쿼리를 수행하면 인덱스 리스트에서 적합한 인덱스를 찾습니다. 그리고 선택한 인덱스로 만들어진 인덱스 테이블 중 쿼리와 일치하는 인덱스 키를 탐색합니다. 이 때 많은 인덱스 키를 탐색할수록 쿼리 실행시간은 느려집니다.
그런 다음에야 찾은 인덱스 키(포인터)로 실제 도큐먼트를 DB로부터 읽어옵니다.

예를 들어 도큐먼트가 10만건 되는 컬렉션에 name 필드가 모두 "Baekho"라면 MongoDB는 name으로 만들어진 인덱스의 모든 인덱스 키를 탐색합니다.
탐색해야하는 인덱스 키 개수는 name 필드를 가진 도큐먼트의 개수와 그 도큐먼트들에 해당하는 인덱스 키의 개수와 관련있습니다.

탐색 된 키는 key examined로 확인이 가능하며, 높을수록 최적화돼있지 않은 인덱스입니다. 따라서 복합 인덱스나 방법을 사용해 도큐먼트를 적게 반환하도록 개선해야합니다.


참고자료

몽고DB 완벽 가이드 3판 - 한빛미디어

'DB > MongoDB' 카테고리의 다른 글

MongoDB 인덱스  (0) 2023.03.09