数据库查询优化之用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 后面的条件成立,则列出数据,否则为空。

你可能感兴趣的:(数据库查询优化之用exists替换in,not exists替换not in)