2011-08-18 2 views
0

나는 원래 MyISAM으로 설정된 스키마를 가지고있다. 외래 키로 정의되지 않은 테이블 사이에는 관계가 있지만 조인 등의 테이블을 연결할 것입니다. 계단식 삭제/업데이트 등의 규칙은 분명 없습니다.MyISAM을 MySQL의 InnoDB로 변환하기

동일한 DB를 다시 작성했습니다. 스키마를 InnoDB와 함께 사용했지만 이번에는 외래 키를 create 문에 넣고 on update/delete 규칙을 정의했습니다.

CSV 파일에서 PHP로 DB에 약 200,000 개의 레코드를로드하고 있습니다. 그것은 원래 몇 분이 걸렸지 만 InnoDB로 바꾼 이래로 PHP 스크립트는 처리 된 CSV 파일의 ~ 7 %만으로 10 분 후에 시간 초과되었습니다.

관계가 없으면 MyISAM으로 다시 전환하고 싶지만 가능한 경우 더 나은 해결책은 처음에는 데이터베이스를 채우는 동안 MyISAM을 사용하고 나중에 InnoDB로 다시 전환하여 MySQL이 관계를 수정하도록하는 것입니다. 이것이 가능한지는 모르지만, 그렇다면 MySQL은 PHP 삽입보다 빠르게 자체 내부 데이터 구조를 수정할 수 있다고 가정합니다.

또 다른 고려해야 할 사항은 약 일년에 한 번씩 200,000 개의 레코드 집합을 다시로드하고 변경된 레코드를 식별해야한다는 것입니다. 우리가 이것을 할 필요가있을 때마다 한 엔진에서 다른 엔진으로 전환 할 수 없을 것입니다.

모든 포인터?

+0

MySQL 버전? 또한 직접 답변 : http://stackoverflow.com/questions/2167522/innodb-takes-over-an-hour-to-import-600mb-file-myisam-in-a-fif-minutes/2167641#2167641 –

+0

MySQL 버전 5.5.8 – Ozzah

+0

더 나은 성능을 얻으려면 innodb 변수를 수정 했습니까? 아니면 모두 기본 설정입니까? –

답변

2

삽입 당 하나의 삽입 쿼리를 사용하는 경우 데이터베이스에 데이터를 삽입하는 데 시간이 오래 걸릴 수 있습니다. 어쨌든 MyISAM 테이블에 삽입하려는 경우

또한
INSERT INTO `table` (field1, field2, field3) 
VALUES 
(value, value, value), 
(value, value, value), 
(value, value, value); 

가, 어느 아무 문제가 없다 :이처럼 mysqldump에 의해 생성 된 형식을 사용하는 경우는 크게 속도가 향상됩니다. 외래 키 무결성이 올바른지 확인하십시오. 모든 데이터를 삽입 한 후에는 모든 테이블에 대해 이렇게하십시오.

ALTER TABLE `table` ENGINE = innodb; 
+0

와우, 나는 그들을 단일 쿼리로 묶을 수 있는지 잘 모릅니다. – Ozzah

2

어려운 당신이 당신의 코드를보고하지 않고 잘못된 일을 할 수 있지만, 몇 가지 당신이 시도 할 수 무슨 말을합니다 :

  1. 실행 SET foreign_key_checks = 0; 당신이로드 완료 후 다음 SET foreign_key_checks = 1;를 로딩을 시작하기 전에 삽입 시간을 단축하십시오.
  2. 매번 자동 커밋되지 않도록 트랜잭션에서 대량 삽입을 실행하고 있는지 확인하십시오.

도움이되는지 확인하십시오.

관련 문제