source

내부 결합으로 업데이트할 때 mysql 쿼리로 CPU 사용률이 높음

itover 2022. 12. 21. 22:30
반응형

내부 결합으로 업데이트할 때 mysql 쿼리로 CPU 사용률이 높음

저는 assign을 둘러보고 여러 가지 방법을 시도해 보았으며 빅데이터를 위한 수입 메카닉을 개선하고 싶었습니다.insert에 데이터를 Import하는 것은 좋지만, 2개의 where 스테이트먼트에 근거해 기존의 데이터를 갱신하고 싶은 경우는 문제가 있습니다.

LOAD DATA LOCAL INFILE을 사용하여 임시 테이블로 데이터를 Import하는 것보다 먼저 소스에서 데이터를 로드하여 CSV 파일에 저장합니다.

온도 테이블에서 메인 테이블로 다음과 같이 삽입하여 예상대로 작동합니다.빠르고 적은 양의 서버 리소스를 사용합니다.

INSERT INTO $table ($fields) SELECT $fields FROM $temptable WHERE (ua,gm_id) NOT IN (SELECT ua,gm_id FROM $table)

레코드의 갱신을 위해서 이하의 것을 가지고 있지 않기 때문에, 중복 키의 갱신이 되지 않았기 때문입니다.항상 새로운 레코드를 삽입했으니까.저는 이 방법이 어떻게 작용했는지 이해하지 못하거나 제대로 사용하지 못했다고 생각합니다.UA와 GM 모두ID는 두 테이블의 인덱스이지만, 이 인덱스를 사용할 수 없습니다.아래 스크립트의 문제는 8000 행을 업데이트하면 CPU 사용률이 200%로 5~8분 이상 걸린다는 것입니다.그건 물론 좋지 않다.

$query = "UPDATE $table a INNER JOIN $temptable b ON a.gm_id=b.gm_id AND a.ua=b.ua SET ";
    foreach($update_columns as $column => $status){
      $query .= "a.$column=b.$column,";
    }
    $query = trim($query, ",");
    $result = $pdo->query($query);

내가 무엇을 사용해야 하는지 누가 나에게 올바른 방향으로 가르쳐 줄 수 있나요?

임시 테이블에서 메인 테이블로 특정 열을 업데이트하려고 합니다.이 코드는 하루 동안 할당 횟수를 실행합니다.때로는 100개의 행만 업데이트할 수 있지만, 때로는 8k 또는 60k의 행이 업데이트되고 열이 변경될 수 있습니다.

샘플 코드가 명확했으면 좋겠어요.

잘 부탁드립니다.

"UA와 GM 모두"ID는 두 테이블의 색인입니다." -- 두 개의 색인은 잘못된 접근 방식입니다.'복합'이 있어야 합니다.UNIQUE(UA, GM_ID)(어느 순서로든)해당 쌍이 고유하지 않으면 IODKU를 사용할 수 없습니다.

WHERE .. NOT IN ( SELECT ... )매우 비효율적입니다. WHERE ... NOT EXISTS ( SELECT ... )더 좋다.LEFT JOIN ... WHERE .. IS NULL더 좋아요.http://mysql.rjweb.org/doc.php/staging_table#normalization 의 「SQL #1」을 참조해 주세요.

고속 섭취에 대한 자세한 내용은 해당 블로그의 나머지 부분을 참조하십시오.

언급URL : https://stackoverflow.com/questions/47470034/high-cpu-with-mysql-query-when-updating-with-inner-join

반응형