programing

두 개의 개별 쿼리가 순간적으로 발생합니다.하위 쿼리로 쿼리가 매우 느립니다. 왜죠? mysql / mariadb

codeshow 2023. 10. 9. 23:38
반응형

두 개의 개별 쿼리가 순간적으로 발생합니다.하위 쿼리로 쿼리가 매우 느립니다. 왜죠? mysql / mariadb

DELETE FROM search WHERE sequence_id IN (34546);

영향을 받는 행: 0 시간: 0,001s

SELECT sequence_id FROM sequences WHERE sequence_status = 1;

확인 시간: 0,001s

DELETE FROM search WHERE sequence_id IN (SELECT sequence_id FROM sequences WHERE sequence_status = 1);

해당 행: 0 시간: 2,868초

내가 뭘 잘못하고 있는 거지?

EXPLAIN DELETE FROM search WHERE sequence_id IN (SELECT sequence_id FROM sequences WHERE sequence_status = 1);

enter image description here

join을 사용해 보십시오.IN.

DELETE search
       FROM search
            INNER JOIN sequences
                       ON sequences.sequence_id = search.sequence_id
       WHERE sequences.sequence_status = 1;

지원하려면 인덱스를 생성합니다.search (sequence_id)그리고.sequences (sequence_id, sequence_status).

CREATE INDEX search_sequence_id
             ON search
                (sequence_id);

CREATE INDEX sequences_sequence_id_sequence_status
             ON sequences
                (sequence_id,
                 sequence_status);
  • IN ( SELECT ... )는 특히 이전 버전의 MySQL/MariaDB에서 최적화되지 않은 것으로 악명이 높습니다.피하세요!
  • 복잡한DELETE/UPDATE예전에는 레임 파서/옵티마이저가 있었습니다.이게 당신이 때린 것 같은데요.최신 버전은 코드를 통합하여 삭제/업데이트 최적화를 향상시켰습니다.
  • 1ms의 시간은 종종 쿼리 캐시가 인수했음을 의미합니다. (따라서, 나는 당신의 첫 두 타이밍을 신뢰하지 않습니다.)
  • 얼마나 큰가요?sequences? 가지고 계십니까?INDEX(sequence_status, sequence_id)?
  • 멀티 테이블 제공DELETE구문 시도, 다르게 최적화될 수 있습니다.

언급URL : https://stackoverflow.com/questions/51225721/two-separate-queries-instantaneous-query-with-a-subquery-very-slow-why-mysql

반응형