2012-05-28 3 views
1

2 억 3 천 7 백만 행의 MySQL 테이블이 있습니다. 이 모든 행을 처리하고 새 값으로 업데이트하려고합니다.MySQL 테이블의 모든 행을 메모리 효율적으로 처리하려면 어떻게해야합니까?

나는 순차적 ID 년대를해야합니까, 그래서 난 그냥 select 문을 많이 사용할 수 있습니다

where id = '1' 
where id = '2' 

Sequentially run through a MYSQL table with 1,000,000 records?에서 언급 한 방법이다.

그러나 메모리에 전체 세트를로드 할 필요없이 큰 파일을 순차적으로 읽는 데 사용되는 커서와 같은 것을 사용하는 것이 더 빠른 방법인지 알고 싶습니다. 내가 보는 방식으로, 커서는 수백만 개의 select 문을 실행하는 것보다 훨씬 빠르게 처리 할 수있는 청크로 데이터를 가져옵니다.

+3

DBI를 보셨습니까? – Mat

+1

당신이 링크 한 방법은 관련이 없습니다/당신이''id = '1', ''2 '', ...을 반복하기위한 허락을 받아들이면 그것을 잘못 읽었습니다. –

+3

데이터를 업데이트 할 값은 무엇입니까? 이미 데이터베이스에있는 것과 관련이 있습니까? 그렇다면 직접 사용하십시오. 그렇지 않은 경우, 새 데이터를 임시 테이블에 삽입 한 후이를 갱신하십시오. – eggyal

답변

7

이상적으로 DBMS를 통해 작업을 수행 할 수 있습니다. 응용 프로그램에 데이터를 리턴하지 않고 데이터베이스에서 전적으로 실행되도록 SQL 문을 작성하십시오. 따로 따로 분류하면 클라이언트에 2 억 3 천 7 백만 건의 메시지와 서버에 2 억 3 천 7 백만 건의 메시지가 저장됩니다.

  • 는 DBMS가 새 값이 있어야 할 것을 결정할 수 있습니다 :이 가능 여부

    업데이트의 성격에 따라 달라집니다?

  • DBMS가 새 값을 결정할 수 있도록 필요한 데이터를 데이터베이스에 가져올 수 있습니까?
  • 2 억 3 천 7 백만 행 중 하나만 변경되거나 하위 집합 만 변경됩니까?
  • DBMS를 사용하여 하위 집합을 결정할 수 있습니까?
  • id 값 중 일부가 전혀 변경됩니까?

id 값을 변경하지 않으면 '관리 가능'이라는 유연한 정의를 위해 데이터를 관리 가능한 하위 집합으로 분할 할 수 있습니다.

트랜잭션 경계를 고려해야 할 수도 있습니다. 로그를 끊지 않고 단일 트랜잭션으로 모든 작업을 수행 할 수 있습니까? 단일 원자 트랜잭션이 아닌 하위 집합으로 작업을 수행하는 경우 운전 프로세스가 1 억 7300 만 개의 행이 충돌하는 경우 처리 할 작업은 무엇입니까? 아니면 DBMS가 그 시점에서 충돌합니까? 처리를 완료하기 위해 작업을 재개 할 위치를 어떻게 알 수 있습니까?

+0

필자는 실제로 단일 SQL 문을 작성할 수 있습니다 (모든 정보는 db에 있음). 그러나 프로덕션 db인데, 확장 된 잠금 (innodb을 사용하고 있습니다. 아마도 문제가 아닙니다.)에 대해 걱정이됩니다. 테이블의 모든 레코드를 업데이트해야합니다. 순간에 나는 인덱스를 사용하여 한 번에 1000 줄을 움켜 쥐고 있습니다. 마지막 질문에 답하기 위해 인덱스 값은 변경되지 않습니다. – Eric

+1

비즈니스가 처음 2 억 행의 업데이트 된 값과 마지막 3700 만 행의 미리 업데이트 된 값을 기반으로 잘못된 결정을 내리지 않는 한, 한 번에 1000 개의 일괄 업데이트가 합리적입니다 . 'id' 컬럼이 변경되지 않는다는 사실은 여러분의 삶을 극적으로 단순화시킵니다. 명시 적 트랜잭션을 사용하고 행이 갱신 된 레코드를 유지하십시오.데이터베이스에 테이블을 추가하여 처리 된 행을 기록하고 1000 행 업데이트를 실행 한 다음 새 테이블을 업데이트하여 변경 사항을 반영한 후 커밋하십시오. –

+0

이것은 매우 현명하고 사려 깊은 대답입니다. +1 명확하고 명확한 언어. 감사. –

관련 문제