SQL NOT IN [ID列表](性能)

我只是想知道列表中的id的数量是否会影响查询性能。SQL NOT IN [ID列表](性能)

查询例如:

SELECT * FROM foos WHERE foos.ID NOT IN (2, 4, 5, 6, 7) 

(2, 4, 5, 6, 7)是无限增长的名单。

有多少人(在订单的背景下)?

更新:我之所以问这个问题,是因为我有两个分贝。它的(只读)是项目的来源,另一个包含由操作员处理的项目。每当操作员要求只读数据库中的新项目时,我想排除已处理的项目。

回答:

是的,列表中的ID数量将影响性能。网络包只有这么大,例如,数据库必须分析所有的噪音,并把它变成一个系列:

WHERE foo.ID <> 2 

AND foo.ID <> 4

AND foo.ID <> 5

AND ...

你应该考虑其他的方式来让你查询了解这一套。

回答:

这里是查询的古怪重写可能执行好一点

SELECT * FROM foos 

LEFT JOIN

(

SELECT 2 id UNION

SELECT 4 UNION

SELECT 5 UNION

SELECT 6 UNION

SELECT 7

) NOT_IDS

USING (id) WHERE NOT_IDS.id IS NULL;

的NOT_IDS子查询不工作如通过以下事项:

mysql> SELECT * FROM 

-> (

-> SELECT 2 id UNION

-> SELECT 4 UNION

-> SELECT 5 UNION

-> SELECT 6 UNION

-> SELECT 7

->) NOT_IDS;

+----+

| id |

+----+

| 2 |

| 4 |

| 5 |

| 6 |

| 7 |

+----+

5 rows in set (0.00 sec)

mysql>

回答:

只是为了好玩,并给予您的更新,我要建议一个不同的策略:

你可以像这样加入表格...

insert into db1.foos (cols) 

select cols

from db2.foos src

left join db1.foos dst

on src.pk = dst.pk

where dst.othercolumn is null

我不确定优化器如何处理这个问题,或者如果它会更快(取决于您的索引策略,我猜),而不是您正在做的事情。

回答:

数据库在同一台服务器上?如果是的话,你可以用一个左连接做一个多数据库查询,并取空。 (这里是一个例子:Querying multiple databases at once)。否则,你可以创建一个存储过程,传递一个字符串的id,并用正则表达式分割它们。我有一个类似的问题,但在内存数据库和postgres数据库。幸运的是,我的情况是(在...)

以上是 SQL NOT IN [ID列表](性能) 的全部内容, 来源链接: utcz.com/qa/262935.html

回到顶部