2010-12-01 6 views
0

나는 하나 개의 테이블을 하나 개의 파일은 (id, x) 값 쌍을 가지고 있으며, 다른 파일은 (id, y) 값 쌍을 가지고있다. 각 행에는 약 2 천만 개의 행이 있습니다. x 파일에 나타나는 대부분의 id 값은 y 파일에 나타나며 그 반대의 경우도 마찬가지입니다.데이터로드

두 파일의 id, xy 값을 t으로로드하는 방법을 제안 할 수 있습니까?

답변

0

LOAD DATA INFILE을 사용하여 각 파일을 두 개의 개별 테이블로로드하십시오. 그런 다음 INSERT INTO ... SELECT를 사용하여 테이블 t에 데이터를 삽입하십시오.

+0

한 테이블에'(id = 23, x = 55)'가있는 행이 있고 다른 행에'(id = 23, y = 126) '행이있는 경우' id = 23, x = 55, y = 126)'t'에서. 첫 번째를't'에 삽입하는 것은 간단합니다. 하지만 두 번째에서 삽입 할 때 중복 키가 생깁니다. INSERT INTO SELECT ... ON 중복 키 업데이트 y = ...이 작업이 필요합니까? –

+0

아니, 그렇지 않으면 SELECT에서 완전히 외부 조인을 할 수 있습니다 (유감스럽게도 MySQL은 FULL OUTER 조인 구문에 대한 지원을 아직 지원하지 않기 때문에 UNIONING RIGHT와 LEFT 조인으로 인한 약간의 작업 임) – Mchl

+0

나는 ' UNION에 대한 귀하의 제안을 따르십시오. t.id가 t의 기본 키인 경우 INSERT INTO t (id, y) SELECT tt.key, tt.val FROM tmptbl FRU tmptbl 중복 키 업데이트 y = tt.val; ''tmptbl (key, val)'이 데이터 파일을로드 한 임시 테이블이라고 가정하면 작동하지 않습니다. –

1

유닉스 시스템을 사용하는 경우 두 파일을 결합하여 표준 출력으로 생성 할 수있는 "가입"에 대한 액세스 권한이있을 수 있습니다. 표준을 MySQL에 직접 대량로드하십시오. 이렇게하면 디스크 쓰기 횟수가 줄어 듭니다.

+0

재미 있습니다. 나는 그것을 시도 할 것이다. Btw : man 페이지에 따르면 join (1)은 입력 파일을 키 열별로 정렬 (1)해야합니다. –

+0

@fsb, 나는 많은 ssh/gzip/dump/load를 colocation과 함께 사용했다. 두 파일을 mysql에로드 한 다음 다른 테이블에 결합 할 수있다. 디스크를 줄이기 위해 파이프를 사용하는 것이 좋지만 관련성이 없습니다. – kevpie

+0

join (1) 먼저 두 테이블을 순서대로 얻은 sort (1)에 대한 응답입니다. sort (1)이 MySQL과 같은 순서를 생성하는 한 괜찮습니다.이 경우 고유 한 INT로 정렬하기 때문에 사실입니다. 그러나 문자열을 정렬하는 경우 sort (1)은 일반적으로 MySQL과 동일한 데이터 정렬 규칙을 사용하지 않으므로 join (1)은 MySQL에서 JOIN과 다른 결과를 생성합니다. 주목할 가치가있는 것입니다. –