본문 바로가기
데이터베이스

실행 계획과 인덱스 다이브

by 흰색남자 2023. 10. 7.

목적

연휴 첫날 심심함을 달래기 위해 공부한다

최적화란

MySQL서버는 여러 통계 정보를 활용해 가장 빠른 실행 계획을 세우는 것을 최적화라 한다.

오라클 DB, Postgresql는 쿼리 실행계획을 캐싱해서 사용하는 반면, MySQL은 쿼리에 대한 실행 계획을 해당 커넥션에만 활용을 하고 다른 커넥션과는 공유를 하지 않는다.

인덱스 다이브란

MySQL에서 쿼리가 실행되면 옵티마이저는 퍼포먼스 스키마의 통계 정보 뿐 아니라 실제 테이블의 데이터를 샘플링해서 실행 계획을 선택한다. 이때 샘플링을 하는 과정을 인덱스 다이브 혹은 랜덤 인덱스 다이브라고 한다.

계획 수립

위와 같은 이유로 MySQL의 계획 수립에는 많은 비용이 소모된다. 하지만 실제 테비을의 데이터를 샘플리하기 때문에 다른 DBMS 서버보다 더 좋은 실행 계획이 나올 경우가 있다. 

왜 인덱스를 최소한으로 만들어야 하는가?

DBMS에서 쿼리가 실행되면 해당 쿼리에 대한 최적의 경로를 수립해야한다. 최적의 경로를 찾기 위해 옵티마이저는 사용 가능한 모든 처리 방법을 고려하여 예상 비용을 계산하게 되는데, 여기서 '사용 가능한 모든 처리 방법' 이 중요하다.

예를들어 유저 테이블이 있고, 유저 테이블에 인덱스가 5개 걸려있다고 생각하자.

SELECT* FROM USER WHERE USER_ID IN (1~1000) AND ADDRES IN ( 1 ~ 1000 );

라는 쿼리를 날릴때 1000000개의 조건에 대한 레코드를 검색한다. 그럼 인덱스가 5개가 걸려있으므로, 인덱스들을 순회하면서 실행계획을 세우게 되므로 실행 계획에 대한 비용이 늘어나게 된다.

그래서 특정한 경우에는 실행 계획을 수립하는 비용이 쿼리를 수행하는 비용보다 클 경우가 있다.

 또한 DBMS는 실행 계획 수립에 대한 메모리가 정해져 있는데, 위와 같은 경우가 많이 발생하게 된다면 시스템 전체적으로 부하가 걸릴 수 있으므로 주의가 필요하다.