오늘은 운영시간에 Index 를 추가해볼 일이 생겨 접하게된

MariaDB Index 추가에 대해 정리해보려 합니다.

 

왜?

신규 서비스를 오픈하고 RDS 에 CPU Utilization 70% 알람이 와서 점검을 해봤다.

신규 서비스에서 요청하는 쿼리가 눈에 띄었고 해당 쿼리 점검 (풀스캔 쿼리 당첨)

인덱스를 추가하면 개선이 될 것 같았다.

 

해도 되나?

내 기억속에 Index 를 추가하는 작업은

'운영시간에  하면 안되고 lock 을 발생시킬 수 있다'

라는 생각이 들었다.

 

하지만 세상이 좋아진건지 검색을 해봤더니 아래와 같은 내용들이 나왔다.

 

인덱스가 생성되는 동안 테이블은 읽기 및 쓰기 작업을 계속 사용할 수 있습니다. 

명령문 CREATE INDEX 는 테이블에 액세스하는 모든 트랜잭션이 완료된 후에만 완료되므로 
인덱스의 초기 상태는 테이블의 최신 내용을 반영합니다.

보조 인덱스 추가를 위한 온라인 DDL 지원은 
일반적으로 보조 인덱스 없이 테이블을 생성한 다음 
데이터가 로드된 후 보조 인덱스를 추가하여 
테이블 및 관련 인덱스 생성 및 로드의 전체 프로세스 속도를 높일 수 있음을 의미합니다.

CREATE INDEX 또는 ALTER TABLE 문의 실행이 완료될 때 테이블에 커밋된 데이터만 포함됩니다.

여기에는 커밋되지 않은 값, 이전 버전의 값 또는 삭제 표시가 되었지만 
이전 인덱스에서 아직 제거되지 않은 값이 포함되어 있지 않습니다.

구글 번역이 불편하지만..

Mysql 공식 도큐먼트에서 Online DDL 이라는 키워드로 검색하면 아래와 같은 내용이 나온다.

Online DDL 이라는 기술로 인덱스 생성 작업중에도 읽기 및 쓰기에 영향이 없다는 내용이였다.

 

 

혹시나 락이 걸리거나 하는 일이 있을 수 있어서 Create Index Downtime 이라는 키워드로 추가 검색을 해봤다.

용량에 비례해서 인덱스를 생성할 때 얼마나 걸리는지가 궁금했다.

 

1억건 20여분..

3억건 30몇분..

대량의 데이터는 분할해서 인덱싱할 수 있게 짜야된다.. 라는 내용이 나왔고

 

대부분의 내용은 테스트를 해보는 방법뿐!

개발계에서 동일한 데이터로 테스트를 해봤다.

1초도 안걸리길래 운영계에도 인덱스 추가완료!

 

기존 120ms 가 걸리던 쿼리가 10ms 로 개선되었다.

기존 풀스캔 14만건 조회하던 쿼리가 100개 미만 데이터 조회로 개선되었다.

반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기