라이브 MyISAM 테이블에 인덱스를 추가하는 가장 쉬운 방법은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/1601735

  •  05-07-2019
  •  | 
  •  

문제

MySQL에서 MyISAM 테이블이 실행 중이며 몇 가지 테스트를 통해 특정 화합물 지수를 추가하여 쿼리 속도를 크게 높일 수 있습니다. 여태까지는 그런대로 잘됐다. 그러나 저는 실제로 테이블을 잠그지 않고 프로덕션 환경 에이 색인을 추가하는 가장 좋은 방법에 관한 것이 아닙니다 (27GBS의 데이터가 많지 않지만 시간이 걸리지 않습니다).

팁이 있습니까? 이것이 더 정교한 설정이라면 물론 다른 컴퓨터의 모든 데이터의 실시간 복제본을 가지고 있으며 안전하게 전환 할 수 있습니다. 불행히도, 우리는 아직 거기에 있지 않으며 가능한 빨리이 쿼리 속도를 높이고 싶습니다 (큰 고객 두통이 발생합니다). 데이터를 복제 한 다음 스왑 아웃 트릭을 수행하는 간단한 방법이 있습니까? 내가 놓친 다른 트릭?

업데이트 : SQL Server의 "온라인 색인 작업"에 대한 읽기는 나를 매우 질투하게 만듭니다. http://msdn.microsoft.com/en-us/library/ms191261.aspx :)

감사!

도움이 되었습니까?

해결책

복제를 사용하여 해당 테이블에 인덱스를 만드는 데 걸리는 시간 대신 몇 분의 순서대로 다운 타임을 얻을 수 있습니다.

노예를 설정하려면 참조하십시오 http://dev.mysql.com/doc/refman/en/replication-howto-co-cevistingdata.html

프로세스 속도를 높이는 데 도움이 될 수있는 권장 사항은 2 단계에 있습니다. "원시 데이터 파일을 사용하여 데이터 스냅 샷 생성"메소드를 따르십시오. 그러나 와이어를 슬레이브에 복사하는 대신 마스터의 다른 위치로 복사하십시오. 사본이 완료되면 마스터를 다시 가져 오면 구성 파일 (Set Server-ID 및 활성화 된 바이너리 로깅)을 변경해야합니다. 이렇게하면 다운 타임이 1 분 또는 2 분으로 최소화됩니다. 서버가 백업되면 복사 된 파일을 슬레이브 상자에 복사 할 수 있습니다.

일단 노예가 일어나고 달리면 모든 것이 제대로 복제되고 있습니다, 당신은 할 수 있습니다 노예를 일시 중지하십시오. Salve에서 색인을 만듭니다. 색인 생성이 완료되면 슬레이브를 재개하십시오. 이것은 노예를 주인에게 붙잡을 것입니다. 마스터에서 플러시 테이블을 읽기 잠금 장치와 함께 사용하십시오. 노예 상태를 확인하여 마스터와 슬레이브 매치의 로그 위치를 확인하십시오. 그렇게한다면 슬레이브를 종료하고 해당 테이블의 파일을 마스터에게 복사하십시오.

다른 팁

나는 랜디와 함께 있습니다. 우리는 비슷한 상황에 처해 있으며 MySQL에는 다음과 같은 것을 달성하는 두 가지 방법이 있습니다.

  1. 서버가 실행되는 동안 서버를 중단하십시오. 이것이 당신이 할 것입니다. 간단하고 쉽습니다. 작동합니다. 할 시간? 디스크 대역폭에 따라 30 분/45 분이 걸릴 수 있습니다. 아래를 참조하십시오.

  2. 새 인덱스로 새 테이블을 만들고, 모든 데이터를 복사하고, 서버를 일시 중지하고, 첫 번째 테이블을 삭제하고, 새 이름을 기존 이름으로 변경하고 서버를 시작하십시오. 중단 시간? 아마도 10 분, 어쩌면 정말 복잡했습니다.

옵션 2가 작동하고 인덱스 생성의 가동 시간을 저장합니다 (시간이 오래 걸리는 경우). 그러나 더 많은 공간이 필요하고 더 복잡합니다 (메인 테이블에서 삽입 된 새로운 레코드를 처리해야하기 때문에 데이터를 복사하는 동안 MyISAM에서 잠기 게 될 것입니다. 테이블을 삭제하는 데 시간이 걸리면 테이블을 변경합니다. 새로운 이름은 시간이 걸릴 것입니다. 정말 복잡합니다. 2TB 테이블이 있다면 이것은 유용 할 수 있지만 27g의 경우 과잉 일 것입니다.

프로덕션 서버와 사양에 가까운 두 번째 서버가 있습니까? 가장 최근의 백업을로드하고 인덱스를 수행하므로 추가하는 데 걸리는 시간에 대해 알 수 있습니다. 그런 다음 다운 타임을 계획하십시오.

Innodb는 많은 것들에 대해 더 좋지만 새로운 인덱스는 여전히 테이블을 잠그고 있습니다. MSSQL (그리고 PostgreSQL)이 잠금없이 그런 종류의 일을해야한다고 생각하는 능력은 훌륭 할 것입니다.

낮은 사용 창을 찾아 인덱스 빌드 중에 응용 프로그램을 오프라인으로 가져갑니다. 복제 나 멀티 마스터 등이 없으므로이 문제에 총알을 물어야합니다. 오전 1시에 뵙겠습니다. :-)

여기서 하나의 서버로 할 수있는 일은 많지 않습니다.

테이블을 복사하고 드라이 런을하는 경우 적어도 라이브 테이블을 잠그지 않고 걸리는 시간이 얼마나 걸릴지 알 수 있으므로 필요한 경우 유지 보수 시간을 예약하거나 결정할 수 있는지 결정할 수 있습니다. 버튼과 사용자가 몇 분 동안 매달려 떠납니다 :)

또는 조용한 시간을 예약하십시오 ...

at 04:00 /usr/bin/mysql -uXXX -pXXX -e 'alter table mytable add key(col1, col2)'
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top