인덱스를 매우 느리게 추가하는 중 ... ETA를 얻거나 진행 상황을 표시하는 mysql cmd가 있습니까?


13

색인을 추가하기 위해 현재 테이블 (20M 항목)에서 대체 쿼리를 실행하고 있습니다. 이미 3 일 이상 실행 중입니다 ( 'tmp to copy to tmp table').

쿼리 진행 상황을 볼 수있는 방법이 있습니까? 아니면 완료 완료 시간을 얻을 수있는 방법이 있습니까?

감사.


4
MyISAM? InnoDB? InnoDB 인 경우 테이블 당 파일이 켜져 있습니까?
Charles

좋은 질문 -하지만 좀 더 연구 할 것입니다 - 나는 즉시 생각할 수있는 가장 좋은 방법은 원시 임시 실제 파일의 크기를 사용하여 대략적인 추측을하는 것입니다

제발 SHOW CREATE TABLE tblname\G테이블에 우리에게 당신이 만들고 싶어 인덱스를 말한다.
RolandoMySQLDBA

답변:


3

mysql이 테이블을 변경하면 본질적으로 테이블의 복사본을 만든 다음 복사본을 교체합니다. 중간에 업데이트를 취소하면 테이블은 여전히 ​​안정적인 상태입니다. 따라서 mysql 데이터 디렉토리 (/ var / lib / mysql /?)를보고 새 파일의 크기를 확인할 수 있습니다. Innodb에서는 좀 더 어렵지만 어딘가에 tmp 테이블이 생성됩니다.

정렬 버퍼 변수 (myisam_sort_buffer_size, sort_buffer_size)를 늘려 인덱스에 걸리는 시간을 크게 줄일 수 있습니다. 당신이 가진 메모리로 최대한 크게 만드십시오. 수정 시간을 며칠 단축 할 수 있으며 메모리 용량에 따라 몇 시간으로 단축 할 수도 있습니다. 약 3 시간 만에 150M 레코드 테이블을 작성했습니다.


불행히도 나는 tmp 테이블을 찾을 수 없었다. innodb_file_per_table을 OFF로 설정하여 innoDB를 사용합니다.

2

innodb_fle_per_table이 OFF이므로 테이블을보고 진행 상황을 측정 할 수 없습니다.

MyISAM에 대해이 작업을 수행하는 방법에 대한 이전 게시물을 작성했습니다 . innodb_file_per_table이 활성화되어 있고 InnoDB 인프라를 재구성 한 경우에만 InnoDB에 대해이를 수행 할 수 있습니다 . 여전히 문제의 파일 크기로 운영 체제를 조사해야합니다.

InnoDB 정리를 완전히 구현하고 innodb_file_per_table을 활성화하면 다음과 같이 인덱스 업데이트를 수행 할 수 있습니다.

예를 들면 다음과 같습니다

  • datadir이 / var / lib / mysql 인 MySQL 인스턴스
  • db.lotsofdata2 천만 개의 이름으로 호출 되는 InnoDB 테이블 :

테이블은 다음과 같습니다.

CREATE TABLE db.lotsofdata
(
    id INT NOT NULL AUTO_INCREMENT,
    name VARCHAR(30),
    PRIMARY KEY (id)
) ENGINE=InnoDB;

이름 색인을 작성한다고 가정하십시오. 당신은 이것을 할 수 있습니다 :

CREATE TABLE db.lotsofdata_new LIKE db.lotsofdata;
ALTER TABLE db.lotsofdata_new ADD INDEX (name);
INSERT INTO db.lotsofdata_new SELECT * db.lotsofdata;
ALTER TABLE db.lotsofdata RENAME db.lotsofdata_old;
ALTER TABLE db.lotsofdata_new RENAME db.lotsofdata;
TRUNCATE TABLE db.lotsofdata_old;
ALTER TABLE db.lotsofdata_old ENGINE=InnoDB;
DROP TABLE db.lotsofdata_old;

INSERT가 실행되는 동안 운영 체제로 이동하여 다음을 실행하십시오.

cd /var/lib/mysql/db
watch ls -l lotsofda*.ibd

현재 크기의 목록이 표시됩니다 lotsofdata_new.ibd. 이 (가)보다 커지면 lotsofdata.ibd완료에 가깝다는 것을 알게됩니다.

BTW MariaDB는 내부적으로 진행 상태가 구현되어 있습니다.


귀하의 의견에 감사드립니다. 지금은 마지막 mysql 버전으로 업그레이드 한 후 쿼리를 종료하고 다시 시도하기로 결정했습니다. 잘만되면 그것은 더 매끄럽게 갈 것입니다.
Atai Voltaire

1

인덱스 생성 진행 상황을 확인할 수있는 확실한 방법은 없습니다. 테이블 당 innodb-file을 설정 한 경우 데이터 디렉토리에 작성중인 임시 .ibd 파일을보고 현재 파일의 크기와 비교하여 약간의 표시를 얻을 수 있습니다. 삭제 / 조각화로 인해 현재 데이터 파일이 부풀어 질 수 있으며 새 데이터 파일에는 이전 파일과 달리 추가 색인이 있습니다.

InnoDB 플러그인이 설치 되지 않은 MySQL 버전을 사용하는 것 같습니다 . InnoDB 플러그인은 빠른 인덱스 생성 기능 을 제공하므로 인덱스 추가 및 삭제를 위해 테이블을 완전히 재구성 할 필요가 없습니다. InnoDB 플러그인은 MySQL 5.5에서 기본적으로 활성화되며 5.1.38 이상의 구성 설정으로 사용할 수 있습니다.

  • 어떤 버전의 MySQL을 사용하고 있습니까?

Percona Server는 5.5 이전의 InnoDB 플러그인이 기본적으로 활성화되어있는 방식을 되찾았습니다.


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.