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