본문 바로가기
MySql

MySQL 특정 값을 가진 일치하는 레코드가없는 레코드를 찾기위한 SQL JOIN

by 베이스 공부 2020. 10. 20.
반응형

저는 몇 년 전에 고용주의 구매 승인 앱을 위해 작성한 일부 코드의 속도를 높이려고합니다. 기본적으로 JOIN으로 바꾸고 싶은 SLOW 하위 쿼리가 있습니다 (빠른 경우).

디렉터가 애플리케이션에 로그인하면 아직 승인하거나 거부하지 않은 구매 요청 목록이 표시됩니다. 이 목록은 다음 쿼리로 생성됩니다.

SELECT * FROM SA_ORDER WHERE ORDER_ID NOT IN
    (SELECT ORDER_ID FROM SA_SIGNATURES WHERE TYPE = 'administrative director');

sa_order에 약 900 개의 레코드와 sa_signature에 1800 개의 레코드가 있으며이 쿼리를 실행하는 데 여전히 약 5 초가 걸립니다. 필요한 레코드를 검색하기 위해 LEFT JOIN을 사용해 보았지만 sa_signature에서 일치하는 레코드가없는 sa_order 레코드 만 가져올 수 있었고 " 'administrative director'유형의 일치하는 레코드가없는 sa_order 레코드가 필요합니다. ". 귀하의 도움에 감사드립니다!

두 테이블의 스키마는 다음과 같습니다.

관련된 테이블의 레이아웃은 다음과 같습니다.

CREATE TABLE sa_order
(
    `order_id`        BIGINT       PRIMARY KEY AUTO_INCREMENT,
    `order_number`    BIGINT       NOT NULL,
    `submit_date`     DATE         NOT NULL,
    `vendor_id`       BIGINT       NOT NULL,
    `DENIED`          BOOLEAN      NOT NULL DEFAULT FALSE,
    `MEMO`            MEDIUMTEXT,
    `year_id`         BIGINT       NOT NULL,
    `advisor`         VARCHAR(255) NOT NULL,
    `deleted`         BOOLEAN      NOT NULL DEFAULT FALSE
);

CREATE TABLE sa_signature
(
    `signature_id`        BIGINT          PRIMARY KEY AUTO_INCREMENT,
    `order_id`            BIGINT          NOT NULL,
    `signature`           VARCHAR(255)    NOT NULL,
    `proxy`               BOOLEAN         NOT NULL DEFAULT FALSE,
    `timestamp`           TIMESTAMP       NOT NULL DEFAULT NOW(),
    `username`            VARCHAR(255)    NOT NULL,
    `type`                VARCHAR(255)    NOT NULL
);

 

해결 방법

 

sa_signatures (type, order_id) 에 대한 색인을 만듭니다.

sa_signatures order_id 에서 null을 허용하지 않는 한 쿼리를 LEFT JOIN 으로 변환 할 필요가 없습니다. 색인을 사용하면 NOT IN 도 수행됩니다. 그러나 궁금한 경우 :

SELECT  o.*
FROM    sa_order o
LEFT JOIN
        sa_signatures s
ON      s.order_id = o.order_id
        AND s.type = 'administrative director'
WHERE   s.type IS NULL

WHERE 절이 제대로 작동하려면 sa_signatures 에서 NOT NULL 열을 선택해야합니다.

 

참조 페이지 https://stackoverflow.com/questions/4853203

 

 

반응형

댓글