woowacourse-study / 2022-Real-MySQL

⚡️토르⚡️의 짜릿한 Real MySQL 뽀개기 🔨
9 stars 3 forks source link

어떠한 상황에서 index를 사용해야 할까? #16

Open hyeonic opened 2 years ago

hyeonic commented 2 years ago

주제

어떠한 상황에서 index를 사용해야 할까?

선정 이유

인덱스를 통해 테이블의 레코드를 읽는 것은 인덱스를 거치지 않고 바로 테이블을 읽는 것보다 높은 비용이 든다. 그렇다면 어떠한 상황에서 index를 활용하는 것이 좋을까에 대한 의문을 알아보기 위해 선정했다.

해당 텍스트

인덱스를 통해 테이블의 레코드를 읽는 것은 인덱스를 거치지 않고 바로 테이블의 레코드를 읽는 것 보다 높은 비용이 든다. 테이블에 100만 건의 레코드가 저장 되었다고 가정하고 그 중 50만건을 읽어야 하는 쿼리가 있다고 가정한다. 이때 우리는 선택해야 한다.

index를 이용한 읽기의 손익 분기점이 얼마인지 판단해야 한다. 일반적인 DBMS의 옵티파이저에서는 index를 통해 레코드 1건을 읽는 것이 테이블에서 직접 레코드 1건을 읽는 것보다 4 ~ 5배 정도의 비용이 더 드는 것으로 예측한다. 정리하면 전체 테이블 레코드의 20 ~ 25%를 넘어서면 index를 활용하기 보다 테이블을 모두 직접 읽는 것이 효율적이다.

전체 레코드의 20 ~ 25% 이상을 읽을 때 강제로 index를 사용하도록 힌트를 추가해도 성능상 이점이 없어진다. 물론 이러한 작업은 옵티마이저가 가볍게 무시하고 직접 읽겠지만 기본적으로 알고 있어야 하는 사항이다.

관련 페이지

229 ~ 230p

awesomeo184 commented 2 years ago

관련 내용 이해가 안되는 부분이 있어서 코멘트 남겨놓습니당.

p.232

그래서 인덱스를 통해 데이터 레코드를 읽는 작업은 비용이 많이 드는 작업으로 분류된다. 그리고 인덱스를 통해 읽어야 할 데이터 레코드가 20~25%를 넘으면 인덱스를 통한 읽기보다 테이블의 데이터를 직접 읽는 것이 더 효율적인 처리방식이 된다.

  1. 인덱스를 통해 읽는 작업이 왜 비용이 많이 드는 작업이라고 표현했는지 잘 이해가 안되네요. 인덱스를 통해 읽으면 비용이 더 적게 들어야하는거 아닌가 싶어서요.
  2. 인덱스를 통해 읽는 것과 데이터를 직접 읽는 것은 어떤 차이가 있는걸까요?
hyeonic commented 2 years ago

단순히 레코드를 읽는 관점에서 간단한 그림으로 표현하였습니다!

아래는 index를 활용하여 데이터 레코드를 읽는 과정입니다. image

결국 실제 데이터 파일에 접근하기 위해 B-tree의 여러 계층을 거쳐 읽게 됩니다.

아래는 index를 활용하지 않고 레코드를 읽는 과정입니다. image

이러한 읽는 과정을 기준으로 위에서 언급한 예시를 다시 한번 살펴보았습니다.

단순히 데이터 파일에 접근하여 모든 레코드를 읽으며 조건을 판단하는 시간 < 옵티마이저가 index를 통해 필요한 데이터를 확인한 뒤 데이터 파일에 접근하여 레코드를 읽는 시간

위 처럼 데이터 파일 까지 접근하는 시간을 비교했을 때 위와 같은 부등호가 되는 시점을 20 ~ 25%라고 판단한 것이라고 생각합니다! 결국 옵티마이저가 판단했을 때 index를 통해 읽어야 할 레코드의 개수가 손익분기점을 넘어서 늘어날수록 바로 데이터 파일에 접근하는 것이 더 빠를수도 있다는 것을 인지해야 합니다.

관련해서 제 생각을 정리하면 index는 매번 좋은 결과를 가져오지 못하며 특정 조건이나 상황에 만족할 때 비로소 유의미한 결과를 가져온다고 판단했어요. 무조건적인 index 생성보다 실행 전략과 실제 사용하고 있는 쿼리를 적절히 분석한 뒤 신중하게 생성해야 하지 않을까란 고민도 함께 진행하였습니다.

제가 이해한 바는 위와 같습니다! 관련해서 더 이야기 나눠보면 좋을 것 같네요 😀