數據庫查詢優化之用exists替換in,not exists替換not in

對於in和not要慎用,會導致全表掃描



用戶表

CREATE TABLE USER(
id INT,
TIME DATETIME,
actuin VARCHAR(25)
);

插入數據

INSERT INTO USER VALUE(101,NOW(),'下單');
INSERT INTO USER VALUE(102,NOW(),'下單');
INSERT INTO USER VALUE(103,NOW(),'下單');
INSERT INTO USER VALUE(105,NOW(),'下單');
INSERT INTO USER VALUE(106,NOW(),'下單');
INSERT INTO USER VALUE(107,NOW(),'下單');
INSERT INTO USER VALUE(108,NOW(),'下單');

日活躍表

CREATE TABLE active(
id INT,
TIME DATETIME,
actuin VARCHAR(25)
);

INSERT INTO active VALUE(101,NOW(),'下單');
INSERT INTO active VALUE(102,NOW(),'下單');
INSERT INTO active VALUE(103,NOW(),'下單');
INSERT INTO active VALUE(105,NOW(),'下單');
INSERT INTO active VALUE(106,NOW(),'下單');
INSERT INTO active VALUE(107,NOW(),'下單');
INSERT INTO active VALUE(108,NOW(),'下單');
INSERT INTO active VALUE(998,NOW(),'下單');
INSERT INTO active VALUE(999,NOW(),'下單');


用戶表是用戶的信息,日活躍表包含老用戶和新用戶。


問題?

查詢日活躍表中的新用戶信息。

傳統的not in查詢


SELECT active.id,active.TIME FROM active WHERE id NOT IN(SELECT id FROM USER);


優化的sql,使用exists

SELECT active.id,active.TIME FROM active WHERE  NOT EXISTS(SELECT id FROM USER WHERE user.id=active.id);



EXISTS在SQL中的作用是:檢驗查詢是否返回數據。當 where 後面的條件成立,則列出數據,否則爲空。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章