반응형
저는 몇 년 전에 고용주의 구매 승인 앱을 위해 작성한 일부 코드의 속도를 높이려고합니다. 기본적으로 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
반응형
'MySql' 카테고리의 다른 글
MySQL Laravel 5.5 비 객체의 'id'속성을 얻으려고합니다. (0) | 2020.10.20 |
---|---|
MySQL mysql.sock은 OSX가 생성되지 않았습니다. (0) | 2020.10.20 |
MySQL 테이블이 비어 있는지 PHP 및 MySql 확인 (0) | 2020.10.20 |
MySQL SELECT id WHERE COUNT (*)> X? -테이블에 X 개 이상의 레코드가있는 사용자로부터 레코드를 가져 오는 방법은 무엇입니까? (0) | 2020.10.20 |
MySQL Can't connect to MySQL server on MySQLCC ERROR 1043 Bad Handshake (0) | 2020.10.20 |
댓글