2013-03-13 3 views
0

나는 약 50 억 개의 행을 가진 MySQL 데이터 테이블을 가지고 있습니다. 이 데이터를 읽음으로써 계산을 실행해야하며 계산 된 데이터 (원래 데이터의 표준화 된 형식)를 다른 InnoDB 테이블에 기록해야합니다.InnoDB 테이블 대량 삽입

우리가 현재 가지고있는 설치 프로그램은 컴퓨터와 데이터베이스가 함께있는 가상 클라우드이므로 컴퓨터 DB 연결은 매우 빠릅니다.

데이터에서 발생하는 계산은 매우 빠르며이 전체 프로세스의 병목 현상은 표준화 된 데이터를 InnoDB 테이블에 삽입하는 것입니다 (표준화 된 데이터에는 몇 가지 지표가 포함되어 있습니다. 길지 않아 삽입 속도가 느려짐).

아쉽게도 innodb_log_file_size (우리는 Amazon AWS를 사용하고 있습니다)와 같은 특정 시스템 변수를 수정할 수 없으므로 삽입 성능을 향상시킬 수 있습니다.

이 데이터를 모두 MySQL로 푸시하는 것이 최선의 방법은 무엇입니까? 계산 과정이 간단하기 때문에, 나는 표준화 된 데이터를 가져 와서 어떤 형식 으로든 출력하는 Python 스크립트를 꽤 많이 작성할 수 있습니다. 계산이 발생할 때마다이 데이터를 즉시 삽입하는 것은 매우 느리며 시간이 지남에 따라 느려집니다.

InnoDB 테이블에 대량 데이터를 삽입하는 가장 좋은 프로세스는 무엇입니까 (입력 형식 및 실제 가져 오기 측면에서)? 이 경우

답변

0

나의 첫번째 본능 조정에 버퍼 변수를 물어이었다 ..하지만 당신은 계산을 수행

... 여기에 또 다른 옵션은, 서버 구성 매개 변수의 많은 부분을 변경하지 못할 것을 말하고있다 출력을 csv로 덤프하십시오. 이 경우 'SELECT ... INTO OUTFILE'명령을 사용합니다. 그런 다음 대상 InnoDB에 연결하고 'set autocommit = 0'을 실행 한 다음 'load data local infile'을 실행하여이 CSV를 대상 테이블로 다시로드하십시오. 마지막으로 자동 연결을 다시 1로 설정하십시오.

오른쪽 분할 스키마, 기본 키 순서 삽입 등과 같은 여러 가지 옵션이 있지만, DB, 들어오는 데이터 세트 및 구조에 대해 알아야합니다. 그 색인.

0

, 당신은 기본 테이블에 아무것도 안하고로 - 만 간격으로 예약 된 차 InnoDB의 테이블에서 데이터를 업데이트 할 가능성을, 나는 아래

  1. 은을 가지고 단계를 perfer 것 - 여기서 (--where "id> 91919"또는 --where "update_time> now() - interval 1 hour") 옵션을 사용하는 mysqldump. 테이블의 가능한 피하기 잠금이 너무
  2. 는 임시 DB 테이블에 데이터를 복원하는 경우
  3. 은 보조 테이블
  4. 버리기 만든 임시 DB/테이블을 임시 DB에 계산을 수행하고 업데이트합니다.
+0

귀하의 의견에 감사드립니다. 나는 당신이 말하는 것을 조금 혼란스러워합니다. 내 테이블 (데이터가있는 원래 테이블과 표준 데이터를 포함 할 대상 테이블)은 모두 동일한 MySQL 인스턴스에 있습니다.계산 된 값을 표준화 된 테이블에 삽입하는 가장 빠른 방법을 찾아야합니다. 다른 것이 명확하지 않으면 알려주세요! – user1094786

+0

첫 번째 테이블은 거대한 테이블이므로 작은 테이블에만 관련 데이터를 추출하고 새 필드를 계산하고 두 번째 테이블을 업데이트하십시오. ** mysqldump **를 선호 ** 테이블에서 임시 테이블 select *를 생성하십시오. 여기서 <> **는 잠금을 방지합니다. – georgecj11

0

당신의 시계열 데이터가 맞습니까? 지난 주에도 비슷한 문제가있었습니다. 로드 된 파티션은 더 빨라졌습니다. 또한 내 설정을 http://www.ajaydivakaran.com/2013/03/12/mysql-innodb-when-inserts-start-slowing-down/에서 최적화했습니다. 그러나 최적화 할 수없는 경우에는 빠른 삽입을 위해 분할을 사용하십시오.

+0

안녕하세요, 스택 오버플로에 오신 것을 환영합니다! 잠재적 인 솔루션에 대한 링크는 언제나 환영하지만, 링크 주위에 컨텍스트를 추가하여 동료 사용자가 그것이 무엇인지, 그 이유를 알 수 있도록하십시오. 항상 중요한 링크의 가장 중요한 부분을 인용하십시오. 페이지가 다른 서버로 이동했거나 직접 링크가 변경되었다고 가정 해 봅니다. 이후 사용자는 답변을 통해 이점을 얻을 수 없습니다. [답변 방법] (http://stackoverflow.com/questions/how-to-answer)을보십시오. – Jesse