Я пытаюсь ускорить некоторый код, который я написал несколько лет назад для приложения авторизации покупки моего работодателя. В основном у меня есть SLOW подзапрос, который я хотел бы заменить на JOIN (если это быстрее).
Когда директор входит в приложение, он видит список запросов на покупку, которые ему еще предстоит авторизовать или отклонить. Этот список создается с помощью следующего запроса:
SELECT * FROM SA_ORDER WHERE ORDER_ID NOT IN
(SELECT ORDER_ID FROM SA_SIGNATURES WHERE TYPE = 'administrative director');
В sa_order есть только около 900 записей и 1800 записей в sa_signature, и выполнение этого запроса по-прежнему занимает около 5 секунд. Я попытался использовать LEFT JOIN для получения нужных мне записей, но я смог получить только записи sa_order без соответствующих записей в sa_signature, и мне нужны записи 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
);