MySQL 테이블에 인덱스를 추가하는 모범 사례

소개



MySQL 테이블에 적절한 인덱스를 만들어 SELECT 쿼리의 성능을 크게 향상시킬 수 있습니다. 그러나 인덱스를 테이블에 추가하는 비용이 높고 테이블의 크기에 따라 완료하는 데 상당한 시간이 걸릴 수 있습니다. 인덱스를 추가하는 동안 인덱스 자체를 만드는 데 리소스가 사용되므로 DB 성능이 저하될 수 있습니다. 이 게시물에서는 일반 워크로드가 영향을 받지 않도록 MySQL 인덱싱 프로세스를 최적화하는 방법에 대해 설명합니다. 기사의 출처는 여기입니다.

인덱스 롤링 생성



MySQL 마스터/슬레이브 세트가 있는 경우 한 번에 하나의 노드에서 롤링 방식으로 인덱스를 작성할 수 있습니다. 마스터의 성능에 영향을 주지 않도록 슬레이브 노드에서만 인덱스를 작성해야 합니다. 슬레이브에서 인덱스 생성이 완료되면 현재 마스터를 강등하고 새 마스터로 슬레이브를 승격시킵니다. 이 시점에서 인덱스 빌드는 원래 마스터 노드(현재 슬레이브)에서 계속됩니다. 장애 조치(failover)로 인해 데이터베이스에 대한 연결이 끊어지는 동안 짧은 기간(수십초)이 있지만, 이는 애플리케이션 수준에서 재시도를 통해 극복됩니다.

롤링 생성의 이점



색인의 롤링 생성 성능의 이점을 이해하기 위해 작은 실험을 수행했습니다.

다음 테스트에서는 Sysbench을 사용하여 만든 MySQL 데이터 세트를 사용했습니다. 각 데이터베이스에는 5000만 행의 세 개의 테이블이 있습니다. 균형 잡힌 워크로드(50% 읽기 및 50% 쓰기)를 10분 동안 실행하는 30개의 클라이언트에서 MySQL 마스터에 부하를 가하고 동시에 다음 시나리오에서 테이블 중 하나에 간단한 보조 인덱스를 구축 :
  • 마스터에서 색인 생성
  • 슬레이브로 인덱싱

  • MySQL 구성







    MySQL 인스턴스 유형
    EC2 인스턴스 m4.large with 8GB RAM

    배포 유형
    2 Node Master-Slave Set 준동기 복제

    MySQL 버전
    5.7.25


    시험 결과




    시나리오
    검색어/초
    95% 타일 레이턴시


    마스터에서 인덱싱
    453.63
    670ms

    롤링 만들기
    790.03
    390ms


    결론



    마스터에서의 인덱스 작성시의 스루풋이 롤링 작성시의 스루풋의 60% 밖에 낼 수 없었습니다. 쿼리의 95% 타일 대기 시간도 마스터에서 인덱싱될 때 1.8배 높아졌습니다.

    롤링 생성 자동화



    ScaleGrid는 MySQL 인덱스의 롤링 생성을 자동화하는 데 유용합니다. UI도 상당히 간단합니다.


    위의 UI에서 데이터베이스 이름과 테이블 이름을 선택하고 "인덱스 추가"를 테이블 변경 작업으로 선택할 수 있습니다. 그런 다음 열 이름과 인덱스 이름을 지정하면 테이블 변경 명령이 생성되어 표시됩니다. 만들기를 클릭하면 인덱스 생성이 롤링 방식으로 한 번에 하나의 노드에서 이루어집니다.

    또한 ScaleGrid는 새 컬럼을 롤링 방식으로 테이블에 추가하는 것과 같은 다른 간단한 테이블 변경 작업도 제공합니다.

    좋은 웹페이지 즐겨찾기