2012-04-25 2 views
1

다른 양과 유형의 열이있는 2 개의 MySQL 테이블이 있습니다. 그러나 DATETIME 유형의 열이 두 개 모두에서 동일하게 호출됩니다. 은 만료입니다.2 DELETE 쿼리 합치기 (방법 및 성능)

지금이 쿼리를 사용하고 있습니다 :

"DELETE FROM `table1` WHERE `expires` < UTC_TIMESTAMP()" 
"DELETE FROM `table2` WHERE `expires` < UTC_TIMESTAMP()" 

Q1 : 나는를 만들 수있는 올바른 방법을 알아낼 수 있도록 나는 아무런 연결이없는 여러 테이블에 대한 DELETE 쿼리를 사용한 적이 단일 쿼리. COMMIT을 사용하지 않고도 사용할 수 있습니까?

Q2 : 내가 아직 DB에 많은 레코드가없는 그래서 PHP에서이 쿼리를 사용하거나 기록 만료 삭제 하나 하나를 사용 사이의 성능 차이를 테스트 할 수 없습니다. 아무도 그것을 알고 있습니까?

답변

0

예를 들어 시간 문제와 관련하여 첫 번째 쿼리는 실행하는 데 1 분이 걸리지 만 시스템에 문제가 발생합니다 (두 번째 테이블 값은 1 분 + 두 번째 쿼리 실행 시간이 지나면 만료됩니다)

begin transaction 
set @ts = utc_timestamp(); 
delete from table_1 where expires< @ts; 
delete from table_2 where expires< @ts; 
commit 

등의 트랜잭션과 함께 사용할 수 있으며 동시에 업데이트됩니다.

+0

감사합니다. 트랜잭션을 사용하는 것이 최상의 성능을 발휘할 수있는 방법이라고 생각됩니다. 1 초 btw를 의미 했습니까? – inhan

+0

이 타임 스탬프는 정확히 같을 것입니까, 아니면 타임 스탬프에 대한 변수를 만들어 대신 사용 하시겠습니까? – inhan

+0

네 말이 맞아. 타임 스탬프에 대한 변수를 생성하면 상황이 개선 될 것입니다. 1 분이 그 예입니다. 그것은 알고있는 100ms 또는 1 일 걸릴 수 있습니다 :) –

0

당신은 하나 개의 쿼리에 두 테이블에서 삭제할 수 있습니다 가입 (가) 데이터 모델에 맞는지

DELETE FROM table1 JOIN table2 ON (join_condition) WHERE table1.expires < UTC_TIMESTAMP() AND table2.expires < UTC_TIMESTAMP 

이 만 의미가 있습니다.

내가 알 수있는 한, 다중 테이블 구문이 더 빠를 이유는 없습니다. 사실, JOIN 할 필요가 있기 때문에 약간 더 느려야합니다 (디스크에서 읽은 후 데이터가 이미 메모리에 있으므로 처리가 약간 손실됩니다).

다중 테이블 구문은 표준 SQL과 호환되지 않습니다. 그것은 mysql 특정 확장 기능입니다.

+0

두 테이블에서 공통점이없는 경우 어떻게 가입 하시겠습니까? – inhan

+0

그러면 데이터 모델에서 테이블을 조인하는 것이 의미가 없다는 것을 의미합니다. 별도로 두 개의 삭제를 사용하십시오. –

+1

실행 시간이있는 prolems를 사용하는 경우 가장 효과적인 솔루션은 두 테이블의 "expires"열에 인덱스를 추가하는 것입니다. 또한 UTC_TIMESTAMP()는 첫 번째 쿼리를 실행하는 데 필요한 시간 때문에 두 개의 호출에서 서로 다른 두 개의 값을 반환합니다. –