읽기 복제본에서 색인 만들기 및 관리

이 페이지에서는 Cloud SQL 읽기 복제본에서 색인을 추가하고 삭제하는 방법을 설명합니다. 복제본은 일반적으로 읽기 전용이지만 보고용으로 테이블에 보조 색인을 만들어야 하는 경우가 있을 수 있습니다. Cloud SQL은 이러한 색인을 관리하기 위한 저장 프로시져 집합을 제공합니다.

용어

  • 클러스터된 색인. 디스크에서 행을 물리적으로 정렬하는 MySQL 테이블의 기본 색인입니다. 테이블에 기본 키를 정의하면 MySQL은 이를 클러스터링된 색인으로 사용합니다. 테이블에는 클러스터링된 색인이 한 개만 있을 수 있습니다.
  • 보조 색인. 쿼리 성능을 최적화하는 MySQL 테이블의 추가 색인입니다.

색인을 위한 저장 프로시져

Cloud SQL은 MySQL 읽기 복제본에 보조 색인을 추가하고 삭제하는 데 사용할 수 있는 두 가지 저장 프로시져를 mysql 스키마에 포함합니다. 이러한 프로시져는 기본 소스 인스턴스에서 실행될 수 있지만 읽기 복제본용으로 설계되었습니다.

mysql.addSecondaryIdxOnReplica
데이터베이스에 보조 색인을 추가합니다. 이 저장 프로시져는 CREATE INDEX DDL 문의 래퍼입니다.

매개변수:

  • idxType - 만들 색인 유형입니다. 예를 들어 UNIQUE를 전달하여 고유한 색인을 만듭니다.
  • idxName - 색인의 이름입니다.
  • tableName - schema.name 형식의 테이블 이름입니다.
  • idxDefinition - 색인의 정의입니다. 바깥쪽 괄호를 포함하지 마세요.
  • idxOption - 색인 생성 시 전달할 추가 옵션입니다. 예를 들어 MySQL 8.0에서는 보이지 않는 색인을 위해 INVISIBLE을 전달할 수 있습니다.

구문:

mysql.addSecondaryIdxOnReplica(idxType, idxName, tableName, idxDefinition, idxOption)
     
mysql.dropSecondaryIdxOnReplica
데이터베이스에 보조 색인을 삭제합니다. 이 저장 프로시져는 DROP INDEX DDL 문의 래퍼입니다.

매개변수:

  • idxName - 색인의 이름입니다.
  • tableName - schema.name 형식의 테이블 이름입니다.
  • idxOption - 색인을 삭제할 때 전달할 추가 옵션입니다. 예를 들어 INPLACE와 같은 알고리즘 옵션입니다.

구문:

mysql.dropSecondaryIdxOnReplica(idxName, tableName, idxOption)
      

idxTypeidxOption 매개변수는 Cloud SQL 인스턴스에서 실행되는 MySQL의 주 버전에 대한 문서를 참조하세요.

예시

올바른 사용

다음은 프로시져 호출의 예시입니다. 다음 정의가 있는 테이블이 있다고 가정해 보겠습니다.

CREATE TABLE sampletest.t1(
   id int(10) unsigned NOT NULL AUTO_INCREMENT,
   first_name varchar(64) NOT NULL,
   last_name varchar(64) NOT NULL,
   license_id int NOT NULL,
   PRIMARY KEY (id),
   KEY idx_fname (first_name)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

first_namelast_name 열에 t1_fname_lname이라는 일반 색인을 만들려면 다음을 실행합니다.

call mysql.addSecondaryIdxOnReplica('', 't1_fname_lname', 'sampletest.t1', 'first_name, last_name', '')

license_id 열에 '고유 라이선스 ID' 주석이 있는 t1_license_id라는 고유한 색인을 만들려면 다음을 실행합니다.

call mysql.addSecondaryIdxOnReplica('unique', 't1_license_id', 'sampletest.t1', 'license_id', 'comment \"unique license id\"')

t1_fname_lname 색인을 삭제하려면 다음을 실행합니다.

call mysql.dropSecondaryIdxOnReplica('t1_fname_lname', 'sampletest.t1', '')

잘못된 사용

idxDefinition 매개변수의 바깥쪽 괄호로 인해 first_namelast_name 열의 색인을 만들지 못했습니다.

call mysql.addSecondaryIdxOnReplica('', 't1_extra_parenthesis', 'sampletest.t1', '(first_name, last_name)', '')

고객이 만든 테이블에만 색인을 추가할 수 있습니다. mysql.servers 테이블의 호스트 열에 색인을 만들려고 하면 실패합니다.

call mysql.addSecondaryIdxOnReplica('', 'idx_invalid', 'mysql.servers', 'host', '')

dropSecondaryIdxOnReplica 프로시져만 사용하여 이전에 addSecondaryIdxOnReplica 프로시져를 사용하여 만든 색인을 삭제할 수 있습니다. 예를 들어 기존 idx_fname 색인을 삭제하기 위한 다음 호출은 실패합니다.

call mysql.dropSecondaryIdxOnReplica('idx_fname', 'sampletest.t1', '')

이러한 프로시져 호출에서는 SQL 삽입이 실패합니다. 예를 들어 주석 시퀀스를 사용한 다음 SQL 삽입이 실패합니다.

call mysql.addSecondaryIdxOnReplica(\"user 'a'@'%' --\", 'idx_fname', 'sampletest.t1', 'first_name', '')

마찬가지로 구분 기호를 사용한 SQL 삽입 시도는 실패합니다.

call mysql.addSecondaryIdxOnReplica('', 'idx_fname', 'sampletest.t1', 'first_name', ';flush status')

읽기 복제본 재생성

때로는 문제가 발생하면 Cloud SQL은 인스턴스를 빠르게 복구하기 위해 기본 소스에서 읽기 복제본을 다시 만듭니다. 재생성 작업 전에 읽기 복제본에 생성된 색인은 유지되지 않습니다. 읽기 복제본의 저장 프로시져를 사용하여 이러한 색인을 다시 만드는 것은 고객의 책임입니다.

다음 단계