2013-02-11 3 views
1

매우 큰 xml 파일을 내 mysql db로 가져 오는 속도를 높이고 싶습니다. 모든 쿼리를 SQL 파일로 덤프하고 콘솔에서 실행하기로 결정했습니다. 조금 더 빠릅니다.SQL 파일에 IF가있는 INSERT 및 UPDATE 쿼리

그러나 내 문제는 단순히 모든 데이터를 삽입 할 수 없다는 것입니다.

일부 테이블이 연결되어있어 매우 빠른 LOAD DATA INFILE 기능을 사용할 수없는 이유가 있습니다. 그래서 SQL 파일에 쿼리를 넣고 싶지만 컨트롤 작업이 필요합니다.

데이터 세트가 있습니다. ID를 사용하는 다른 테이블에 데이터를 추가 할 수 있도록 ID (기본 키)가 필요합니다. 그것은 단지 "IF 선택"와 함께 작동, 분명히

INSERT IGNORE INTO tableA VALUES (A, B, C); 
SET @id = LAST_INSERT_ID(); 
IF(@id, SELECT 1, SELECT id INTO @id FROM tableA WHERE a=A and b=B and c=C); 
INSERT INTO tableB VALUES (@id, B, C); 

는 IF 문 나던 작업 :

그래서 제가 mysql을 콘솔을 통해 시도하는 것은 이것이다.

내가하려는 것은 INSERT IGNORE를 사용하여 tableA에 데이터 세트를 추가하는 것이므로 중복 된 오류는 무시됩니다. 그것은 새 행을 추가하는 경우 LAST_INSERT_ID() 함께 @ ID를 얻을 중복, @ ID가 비어 있지만 내 IF 검사를 사용하여 복사 및 INTO 넣어 @a, 그래서 어쨌든 나는 @id 세트. 그럼 난 올바른 연결 있도록 tableB에 내 데이터를 넣어 @ id를 사용합니다.

IF를 사용하여이 워크 플로우를 수행 할 가능성이 있습니까? 몇 가지 검사를해야하는 연결된 테이블 때문에 LOAD DATA INFILE을 사용하는 간단한 CSV를 만들 수 없으므로 SQL을 생성하는 것이 가장 좋습니다.

내 XML 파일은 20-25GB 크기입니다. 필자의 perl 스크립트는 모든 검사를 수행하면서 데이터베이스로 가져 오기 위해 3 주와 같이 작동하지만 모든 MySQL 쿼리로 인해 매우 느리며 모든 쿼리를 하나의 파일에 넣고 한 번에 DB에 저장하려고합니다. 내 쿼리 흐름을 제어 할 수 있다면 필자의 펄 스크립트에서 수표 수백만 개를 실행하는 대신 큰 SQL 파일을 만들 수 있습니다.

말해 주실 수 있습니다.

답변

1

나는 그렇게 할 필요가 있는지 확신하지 못합니다.

INSERT IGNORE INTO tableA VALUES (A, B, C); 
INSERT INTO tableB SELECT id, B, C FROM tableA WHERE a=A AND b=B AND c=C; 

내가 실현이 정확히는 AS 동일하지 않습니다 : tableA.a, tableA.btableA.c 모든 다음에 관계없이 행 항목이 성공 여부에 tableA.id을 결정하면, 당신은 할 수 있어야 게시 한 검색어. 가장 큰 차이점은 행이 실제로 tableA에 올바르게 삽입 된 경우 (즉, 중복 행 오류가없는 경우) 위의 명령문은 tableB의 첫 번째 필드에 1 값을 삽입하지 않는다는 것입니다. 즉 당신이 정말로 원하는 무엇을 경우, 다음과 같은 작업을해야합니다 :

INSERT IGNORE INTO tableA VALUES (A, B, C); 
SET @id = LAST_INSERT_ID(); 
INSERT INTO tableB SELECT IF(@id IS NOT NULL, 1, id) 
        FROM tableA 
        WHERE a=A AND b=B AND c=C; 

그리고 LAST_INSERT_ID()NULL을 반환하고 마지막으로 성공한 삽입이 아닌 실제 자동 증가 값 것이라고이 있으리라 믿고있어. 나는 실제 행동을 확인하지 못했습니다.