2009-10-21 4 views
0

mySQL에서 프로덕션 환경에서 실행되는 myISAM 테이블을 가지고 있으며 몇 가지 테스트를 통해 특정 복합 인덱스를 추가하여 쿼리의 속도를 크게 향상시킬 수 있음을 발견했습니다. 여태까지는 그런대로 잘됐다. 그러나 필자는 장시간 테이블을 잠그지 않고 프로덕션 환경에서이 인덱스를 추가하는 가장 좋은 방법은 아닙니다. 27GB의 데이터가 있으므로 너무 오래 걸리지는 않지만 시간이 많이 걸립니다.라이브 myISAM 테이블에 인덱스를 추가하는 가장 쉬운 방법은 무엇입니까?

팁이 있습니까? 이것이 더 정교한 설정이라면 다른 컴퓨터의 모든 데이터를 실시간으로 복제 할 수 있으므로 안전하게 전환 할 수 있습니다. 유감스럽게도 아직 위치 정보가 없기 때문에 빠른 시일 내에이 쿼리의 속도를 높이고 싶습니다. 데이터를 복제 한 다음 스왑 아웃 트릭을 수행하는 간단한 방법이 있습니까? 제가 누락 된 다른 트릭이 있습니까?

업데이트 : SQL Server의 "온라인 인덱스 작업"에 대해 읽기 http://msdn.microsoft.com/en-us/library/ms191261.aspx :

감사합니다 나를 매우 질투한다!

+0

잠시 동안 데이터베이스에 대한 쓰기 액세스를 제한 할 수 있습니까? –

답변

3

복제본을 사용하면 테이블에 인덱스를 만드는 데 걸릴 수있는 시간 대신 몇 분 만에 중단 시간을 얻을 수 있습니다.

는 슬레이브를 설정 http://dev.mysql.com/doc/refman/5.0/en/replication-howto-existingdata.html

내가 "원시 데이터 파일을 사용하여 데이터 스냅 샷 만들기"방법을 수행하는 과정을 2 단계에 속도를 수 있도록 할 수 있습니다 추천을 볼 수 있습니다. 하지만 와이어를 통해 슬레이브로 복사하는 대신 마스터의 다른 위치로 복사하십시오. 복사가 끝나고 config 파일 (set server-id 및 enabled binary logging)에 필요한 변경을 수행하자마자 마스터를 다시 백업하십시오. 이렇게하면 다운 타임을 1 ~ 2 분으로 최소화 할 수 있습니다. 일단 서버가 백업되면 복사 된 파일을 슬레이브 박스에 복사 할 수 있습니다.

일단 슬레이브를 실행하고 실행하면 verified everything is replicating properly이되며 pause the slave이 될 수 있습니다. 연고에 색인을 만드십시오. 인덱스 생성이 완료되면 슬레이브를 다시 시작하십시오. 이것은 주인까지 노예를 붙잡을 것이다. 마스터에서 FLUSH TABLE WITH READ LOCK을 사용하십시오. 슬레이브 상태를 점검하여 마스터와 슬레이브의 로그 위치가 일치하는지 확인하십시오. 그럴 경우 슬레이브를 종료하고 해당 테이블의 파일을 마스터로 다시 복사하십시오.

0

사용 빈도가 낮은 창을 찾고 색인 작성 중에 응용 프로그램을 오프라인으로 만드십시오. 복제 나 멀티 마스터 등이 없으므로이 글 머리 기호를 물어야합니다. 오전 1시에 보자. :-)

0

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

테이블을 복사하고 마른 실행을하는 경우 적어도 라이브 테이블을 잠그지 않고 얼마나 오래 걸릴지 알 수 있으므로 필요한 경우 유지 관리 일정을 예약하거나 그냥 ... 내가 랜디와 함께 해요

at 04:00 /usr/bin/mysql -uXXX -pXXX -e 'alter table mytable add key(col1, col2)' 
1

을 버튼을 누르고 몇 분 :

아니면 조용한 시간에 예약 교수형 사용자를 남길 수 있습니다. 우리는 비슷한 상황에 있었고, 이런 식으로 뭔가를 달성하기 위해 MySQL은 두 가지 방법이 있습니다 : 그것은 실행되는 동안

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

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

옵션 2가 작동하며 인덱스를 만드는 데 시간이 오래 걸리면 작업 중단 시간이 절약됩니다. 하지만 더 많은 공간이 필요하다. (메인 테이블에 삽입 된 새로운 레코드를 다루어야하기 때문에 더 복잡하다. 그리고 데이터를 복사하는 동안 MyISAM을 잠글 것이다.) 테이블을 삭제하는 것은 다소 시간이 걸리고 테이블을 새로운 이름은 다소 시간이 걸릴 것입니다. 정말 복잡합니다 .2TB 테이블을 사용하면이 방법이 유용 할 수 있지만 27G의 경우에는 잔인합니다.

프로덕션 서버와 비슷한 사양의 두 번째 서버가 있습니까? 가장 최근의 백업을로드하고 거기에 인덱스를 추가하여 추가하는 데 걸리는 시간을 알면 가동 중단 시간을 계획하십시오.

InnoDB는 많은 것들이 더 좋지만 새로운 인덱스는 여전히 테이블을 잠급니다. 능력은 MSSQL (그리고 나는 PostgreSQL이 그런 종류의 일을해야한다고 생각한다.) 잠금 기능이없는 것들은 훌륭합니다.