2010-04-13 5 views
5

MEMORY 테이블에서 MYISAM 테이블로 레코드를 빠르게 이동하는 방법을 찾고 있습니다. MEMORY 테이블에는 약 50 만 개의 레코드가 있습니다. 두 테이블 모두 정확히 동일한 구조 (열 수, 데이터 형식 등)와 동일합니다. 그러나 MYISAM 테이블은 몇 개의 칼럼에서 색인이 생성됩니다 (B-TREE). 대부분 약 25 개의 열이 부호없는 정수입니다.MEMORY 테이블에서 MYISAM 테이블로 만 레코드 이동

"INSERT INTO SELECT * FROM"쿼리를 사용해 보았습니다. 그러나 이것을 수행하는 더 빠른 방법이 있습니까?

감사합니다.

Prashant

원칙적으로

답변

0

, 당신은으로 좋은 성능을 얻을해야합니다

  1. 는 보조 인덱스없이 목표 테이블을 작성합니다.

  2. 대상 테이블의 기본 키에서 소스 테이블의 내용을 정렬하십시오.

  3. 대상 테이블에 정렬 된 레코드를 삽입하십시오.

  4. 보조 색인을 한 번에 하나씩 추가하십시오.

+0

예,의 MyISAM에 그, 제외 보조 인덱스를 추가하면, 모든 인덱스와 데이터 파일을 다시 작성합니다. – MarkR

0

아마도 대부분 조정에 관한 것입니다. 초기에 MyISAM 테이블이 비어 있습니까? 그렇다면로드 중에 인덱스를 비활성화 한 다음 사용 가능하게 설정하십시오 (비어 있지 않은 테이블에서는 좋지 않습니다).

메모리 테이블에서 ORDER BY를 수행하는 것은 일반적으로 해시 인덱스를 사용하므로 일회용 인덱스 스캔을 수행 할 수 없기 때문에 여분의 filesort()가 도입 될 가능성이 있습니다 .

1

다른 사람들이 지적했듯이 삽입 중에는 색인을 사용하지 않아야합니다.

ALTER TABLE table DISABLE KEYS; 
INSERT INTO table 
ALTER TABLE tbl_name ENABLE KEYS; 

을 또한 단일 인덱스 쓰기 얻을 수있는 테이블을 잠금 : 당신은 모든 삽입에 그들을 업데이트 해제 할 수 있습니다 당신이 얻지 못할 수도 단일 INSERT ... SELECT에서 그것을 사용하는 경우, 어쨌든

LOCK TABLES table WRITE; 
INSERT INTO table 
UNLOCK TABLES; 

을 상당한 성능 향상.

bulk_insert_buffer_size 설정을 서버 구성에서 조정할 수도 있습니다.

는에

더 : 당신이 정말로 한 번에 모든 인덱스를 추가 할 수 있도록 http://dev.mysql.com/doc/refman/5.0/en/insert-speed.html

관련 문제