거의 400,000 개의 레코드가있는 "table1"테이블이 있습니다. 약 450,000 개의 레코드가있는 또 다른 테이블 "table2"가 있습니다.
table2에서 중복되는 table1의 모든 행을 삭제해야합니다. 나는 PHP로 그것을 시도했고 스크립트는 몇 시간 동안 실행 중이었고 아직 완료되지 않았습니다. 정말 그렇게 많은 시간이 걸리나요?
필드 asin은 table1의 varchar (20)입니다.
ASIN 필드는 table2의 Index 및 char (10)입니다.
$duplicat = 0;
$sql="SELECT asin from asins";
$result = $conn->query($sql);
if ($result->num_rows > 0) {
while($row = $result->fetch_assoc()) {
$ASIN = $row['asin'];
$sql2 = "select id from asins_chukh where ASIN='$ASIN' limit 1";
$result2 = $conn->query($sql2);
if ($result2->num_rows > 0) {
$duplicat++;
$sql3 = "UPDATE `asins` SET `duplicate` = '1' WHERE `asins`.`asin` = '$ASIN';";
$result3 = $conn->query($sql3);
if($result3) {
echo "duplicate = $ASIN <br/>";
}
}
}
}
echo "totaal :$duplicat";
u는 루프 대신 하나의 단일 SQL 명령을 실행할 수 있습니다.
update table_2 t2
set t2.duplicate = 1
where exists (
select id
from table_1 t1
where t1.id = t2.id);
경고! 위의 SQL을 테스트하지 않았으므로 구문을 확인해야 할 수도 있습니다.
이러한 종류의 데이터베이스 작업의 경우 PHP를 사용하여 루프 및 조인하는 것은 결코 좋은 생각이 아닙니다. 대부분의 시간은 PHP 서버와 mysql 서버 간의 네트워크 데이터 전송에 낭비됩니다.
위의 SQL조차도 너무 오래 걸리면 쿼리 세트를 일정 범위로 제한하는 것을 고려할 수 있습니다. 다음과 같은 것 :
update table_2 t2
set t2.duplicate = 1
where exists (
select id
from table_1 t1
where t1.id = t2.id
and t2.id > [range_start] and t2.id < [range_end] );
이렇게하면 병렬로 실행되는 여러 업데이트를 시작할 수 있습니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다