如何索引不在另一个表中的值

Posted

技术标签:

【中文标题】如何索引不在另一个表中的值【英文标题】:How to index for values that are not in another table 【发布时间】:2018-11-08 19:53:34 【问题描述】:

我需要找到在一个表中但不在另一个表中的所有 ID。

我的简单选择是:

SELECT ID 
FROM  Table1 
WHERE ID NOT IN (SELECT id FROM Table2)

但是如果我做一个EXPLAIN QUERY PLAN 我会得到

"0"|"0"|"0"|"SCAN TABLE Table1"
"0"|"0"|"0"|"USING INDEX index_Table2_id FOR IN-OPERATOR"

我的两个表都将id 定义为id integer PRIMARY KEY,(用于table1)和table2 的普通索引。

关于如何加快查询速度的任何建议?

我在 table1 中有 ~200000 条记录,在 table2 中有 ~200 万条记录,查询运行大约需要 500 毫秒。

是什么导致查询运行如此缓慢,有什么可以加快速度的建议吗?

【问题讨论】:

500 毫秒来比较两个表的整体对我来说似乎很快。 您正在扫描两个包含大量数据的表。正如 Gordon 指出的那样,500 毫秒对于此类查询来说已经足够快了。 【参考方案1】:

您可以将LEFT JOINtable2.ID IS NULLWHERE 子句一起使用:

SELECT table1.ID
FROM table1 LEFT JOIN table2 ON table1.ID = table2.ID
WHERE table2.ID IS NULL;

我相信这会更快。

【讨论】:

以上是关于如何索引不在另一个表中的值的主要内容,如果未能解决你的问题,请参考以下文章

T-SQL:如何在值列表中选择不在表中的值?

SQL 存在一个表而不在另一个表中的数据

MYSQL查询~ 存在一个表而不在另一个表中的数据

SQL查询 —— 存在一个表而不在另一个表中的数据

Mysql:从一个表中选择不在另一个表中的行

如何使用 DB2 sql 检查不在两个表中的记录以获取另一个第三个表中的日期?