2012-09-09 4 views
0

나는 테이블 Calls을 삭제 : messageType, callIdlastModified. 각 통화에 대한 동시 LOAD 데이터 INFILE 3 열이

는, 4 행은 DB, 각 메시지에 대해 하나에 기록됩니다. CALL-SETUP, CALL-PROGRESS, CALL-START (코드 4) CALL-STOP : 메시지의 4 종류가 있습니다.

messageTypecallId은 기본 키를 구성한다.

나는 다음 행을 삭제할 : 행이 종료 된 통화에 해당

  • . CALL-STOP 메시지가 DB에 기록되면 호출이 종료됩니다.
  • 4 시간 이후로 수정되지 않은 행 (예 :).

    DELETE FROM Calls WHERE callId IN (SELECT * FROM (SELECT DISTINCT callId FROM Calls WHERE messageType=4 OR TIMESTAMPDIFF(SECOND,lastModified,NOW()) > 14400) AS tmp); 
    

    난 단지 테이블을 청소하는이 문을 사용

나는 다음과 같은 쿼리를 사용했다. 하지만 동시에 테이블은 LOAD DATA INFILE을 사용하여 대용량 파일 (약 30000 행)에 의해 매우 빈번하게 (예 : 매초마다) 채워지고 실제로 데이터로드와 데이터로드만으로는 성능 차이가 있습니다.

성능을 향상 시키려면 어떻게해야합니까? SQL 삭제? DB 자체에?

정확하게 MySQL을 사용합니다.

감사

당신을 위해
+0

'통화'테이블에서 사용하는 스토리지 엔진은 무엇입니까? – eggyal

+0

@eggyal 새로운 테이블이기 때문에 사용할 스토리지 엔진을 선택할 수 있습니다. 어느 것이 좋습니다? –

+0

아직 존재하지 않는 테이블의 성능 저하를 어떻게 확인할 수 있습니까? – eggyal

답변

0

몇 가지 생각 : 정말 DISTINCT 싫어

1). 각 호출에는 하나의 messageType 만 4입니까? 그렇다면 OR 절의 수정 된 부분에 DISTINCT를 사용하고 있습니다. 어떻게 이것에 대해 :

WHERE messageType = 4 
OR (messageType = 1 and lastModified < datesub(now(), interval 4 hour) 

(그래서 당신은 다시 하나 개의 ID를 얻을 수 있습니다 그들 DISTINCT에 대한 필요가 없습니다).

2) 날짜 열에 공식을 실행하지 마십시오 - 엔진이 인덱스를 사용할 수 없습니다! 위의 WHERE 절을 참조하여 수식을 다른 측면으로 이동하십시오. 여기서 인덱스를 사용할 수 있고 상수 값은 캐시 될 수 있습니다.

3) 당신은 당신의 인덱스를 설명하지 않지만, 당신은 아마 (과 lastModified은 messageType, callId)에 복합 인덱스를 원하는 것입니다. 다른 사람이 언급 한 것처럼

4), 엔진 선택은 중요합니까. myisam은 모든 것을 잠급니다. innodb을 사용해보십시오.

5) 때때로 MySQL은 날짜의 큰 범위에 대한 날짜 인덱스를 좋아하지 않는다. 작은 배치를 삭제하기 위해 스크립트를 사용해보십시오.

행운을 빈다.