2010-03-10 3 views
1

나는 비교적 간단한 개체 모델이 있습니다이 간단한 시나리오에서 MySQL 처리량을 어떻게 향상시킬 수 있습니까?

  • 업데이트 ParentObject
  • ChildObject1 테이블에서 이전의 모든 항목을 삭제 (:

    ParentObject 
        Collection<ChildObject1> 
        ChildObject2 
    

    MySQL의 작업을 수행하는 다음이 개체 모델을 저장할 때 약 10 행)

  • 모두 새로 입력 ChildObject1 (다시 약 10 행)
  • 삽입 ChildObject2

개체/테이블 하찮은이다 - 아니 strings 아니라 주로 intslongs.

MySQL은 현재 초당 약 20-30 인스턴스의 개체 모델을 저장하고 있습니다. 이것이 금식에 들어갈 때 현재의 속도로 10 시간 이상 걸리는 백만 세이브가 넘을 것입니다.

자바와 스프링을 사용하고 있습니다. 내 애플 리케이션을 프로파일 링하고 병목 목은 MySQL에 대한 호출에 장거리로있다.

어떻게 처리량을 늘리시겠습니까?

+0

스크립트를 통해 이러한 작업을 어떻게 수행합니까? 그렇다면 어떤 언어입니까? – Seaux

+0

질문을 업데이 트했습니다. 죄송합니다 – MalcomTucker

답변

-1

테이블에서 기존 ChildObject1 레코드를 삭제 한 다음 Parent 개체의 현재 상태에있는 ChildObject1 인스턴스를 삽입하는 것이 불필요한 것 같습니다. 모든 하위 개체의 값이 이전에 저장된 것과 다릅니다?

더 좋은 해결책은 필요할 때, 즉 ChildObject1 인스턴스의 상태가 변경된 경우에만 데이터베이스를 수정하는 것입니다.

이 유형의 항목에 대한 고유 한 지속성 논리를 롤링하는 것은 어려울 수 있습니다 (보존시 계층은 저장시 개체 버전과 비교하기 위해 검색 될 때 ChildObject1 개체의 상태를 알아야합니다.). Hibernate와 같은 ORM을 사용하여 데이터베이스의 레코드를 업데이트해야하는지 여부를 알 수있는 훌륭한 작업을 수행 할 수 있습니다.

+1

최대 절전 모드 가이 일을위한 끔찍한 생각이 될 것입니다, 일괄 처리와 JDBC는 당신이 원하는 것입니다. –

+0

다른 객체로 더티 상태를 모니터링하고 있지만 다른 객체의 집합이기 때문에 자식 객체로 상태를 모니터링 할 수 없습니다. 이러한 집계는 단순히 삭제 및 다시 삽입하는 것보다 더 많은 데이터베이스 작업을 필요로하는 신규, 수정 또는 삭제 및 unpicking 일 수 있습니다. – MalcomTucker

1

개체 (특히 하위 개체 컬렉션)에서 더티 플래그를 추적하여 속도를 높일 수 있습니다. 더러운 것들만 삭제/업데이트합니다. 각 쓰기에서 변경되는 비율에 따라 좋은 덩어리를 저장할 수 있습니다.

다른 방법으로 준비된 명세서의 일괄 업데이트를 통해 일괄 쓰기를 수행 할 수 있습니다. (PreparedStatement.addBatch()를 봐라.) 이것은 엄청 빠르지 만 record에 의해 레코드가 아닐 수도있다.

  • 은 하나의 배치 명령
  • 삽입 하나의 배치 명령과 모든 더러운 국적 자녀로서
  • 업데이 트를 하나의 배치 명령으로 모든 부모를 모든 더러운 플래그 아이들을 삭제 : 같은 것을 볼 수 있습니다.당신은 아마지도에 그들 모두를로드하고 한 번에 덤프 할 수하지 않을거야 기록의 수백만을 취급하고 있기 때문에, 당신이 배치 처리기로 스트리밍해야한다는

주 변경 사항을 한 번에 db 1000 레코드에 덤프 할 수 있습니다. 이 작업을 완료하면 실제 속도는 배치 크기에 민감하므로 시행 착오를 통해 기본값을 결정해야합니다.

+0

나는 이것에 대해 생각했다. 그러나 객체를 쪼개고 일괄 처리하면 데이터 불일치가 생길 수있다. 따라서 자식을 삭제 한 후 새 객체를 삽입 한 후에 사용자가 부모 객체를 쿼리하면 불완전한 데이터 세트를 검색하게된다. 그것은 또한 받아 들일 수없는 것이 될 것입니다. 그 말이 합당합니까? – MalcomTucker

관련 문제