2014-05-16 2 views
1

특정 날짜에 API 호출을 통해 대량의 JSON 데이터를 가져 오는 레거시 API 응용 프로그램이 있습니다.MySQL은 많은 양의 행을 삭제하고 중단없이 새 데이터를 다시 입력합니다.

데이터베이스를 새 정보로 업데이트하려면 해당 날짜와 관련된 모든 행을 삭제 한 다음 모든 새로운 행을 루프하고 삽입해야합니다. 이것은 날짜 당 약 1200 행입니다. 삽입은 JSON 데이터가 각 행에서 추가 작업이 필요하므로 '루프'로 처리해야합니다.

약 5 분마다 정기적으로 발생합니다.

이 기간 동안 - 연중 무휴로 현재 데이터에 정기적으로 액세스하는 사용자가 있습니다. 보고서를로드하거나 데이터가 없거나 데이터가 불완전한 것으로 보이는 보고서가 있습니다.

나의 추측에 따르면 데이터 삭제 및 '재로드'사이의 보고서에 액세스하고 있습니다. 이 문제가 발생하지 않도록하려면 어떻게해야합니까?

내가 알아야 할 것은 DB 트랜잭션이이 문제를 해결할 것인가입니다. DB 트랜잭션은 무언가가 실패 할 경우 작업 중에 롤백을 허용한다는 것을 알고 있습니다. 그러나 한 트랜잭션 내에서 끊김없는 삭제 및 업데이트도 허용합니까? 이

try { 
    $db->beginTransaction(); 

    $db->query('delete query'); 
    $db->query('insert query'); 

    $db->commit(); 
} catch (Exception $e) { 
    $db->rollback(); 
} 
+0

호기심에서 db 유형 innoDB입니까? – KarelG

+0

임시 데이터베이스에 행을 삽입 한 다음 업데이트가 완료되면 데이터베이스 이름을 바꿉니다 –

+2

거래를해야합니다. 맞습니다. 나는 트랜잭션을 시작하기 전에 json을 구문 분석하고 SQL 형식으로 저장하여 필요한 모든 입력을 체인으로 연결하여 단일 삽입 쿼리를 실행할 수 있습니다. – rekaszeru

답변

1

것은 같은

즉 뭔가 예를 들어 MySQL은 행으로 잠글 수 있습니다를 들어, 데이터베이스에 데이터 처리를 잠그는 것입니다.

transaction model and locking

또한, MySQL은, 당신은 모든 인서트를 exe 인과 한 번에 삭제하는 절차 저장 쓰기 수 있으며, 실행 중에 다른 기능은 데이터에 액세스 할 수 없습니다.

0

DB 트랜잭션이 문제를 해결할 것이라고 생각하지 않습니다. 귀하의 경우, 모든 데이터를 삭제하기 때문에 : "잘라야 테이블"을 수행하여 삭제 진술을 빠르게 할 수 있습니다. truncate 테이블은 로그를 유지하지 않으므로 빠릅니다.

가 유의 사항 : 자르기가 자동 증가 모든

1

첫 번째로 PK에 대한 카운터를 재설정합니다, 당신은 이노을 사용해야합니다. MyISAM은 LOCK TABLE을 제외한 어떤 종류의 트랜잭션도 처리하지 않으므로 사용자가 엉망이됩니다.

둘째, DELETE 쿼리가 어리석은 천천히 수행되지 않도록 테이블이 올바르게 인덱싱되었는지 확인하십시오. 즉, 전체 테이블 검색을 수행하지 마십시오. 아마도 DATE 또는 DATETIME 필드를 인덱싱한다는 의미 일 수 있습니다.

셋째, 같이 삭제하여하지 않는다 :

DELETE FROM table WHERE DATE(timestampcol) = '2014-01-01' 

는 대신 이렇게 : 당신의 timestampcol은 날짜와 시간 (즉 모두가 포함되어있는 경우

DELETE FROM table WHERE timestampcol = '2014-01-01' 

또는, 그것은 비 포함 - 잠시만) 다음과 같이 색인을 사용할 수 있는지 확인하십시오.

DELETE FROM table WHERE timestampcol >= '2014-01-01' 
        AND timestampcol < '2014-01-01' + INTERVAL 1 DAY 

다섯째,이 작업에 트랜잭션을 사용하십시오. 그것은 기본적으로 귀하의 질문에 맞습니다.

여섯째, DELETEINSERT 행 대신에 UPDATE 행을 사용할 수 있습니까? 사용자가 읽은 데이터의 무결성을 방해하지 않고 행별로이 작업을 수행 할 수 있습니까? 가능한 경우 거래가 완료되는 동안 기다리지 않고 "사용자의 코 밑에있는"날짜를 변경하는 방법 일 수 있습니다.

일곱 번째 : 이것은 어렵습니다. 파티션 된 테이블을 사용하고 업데이트하는 날의 파티션을 바꿀 수 있습니다. 파티션 당 행 수가 1,200 개 밖에 없다면 현재 수행중인 작업에 대해 과도한 부담이 될 수 있습니다. 그러나 프로그래밍 비용과 sysadmin 번거 로움에 따라 확장 될 것입니다.

관련 문제