我只是想知道列表中 id 的数量是否会影响查询性能。
查询示例:
SELECT * FROM foos WHERE foos.ID NOT IN (2, 4, 5, 6, 7)
(2, 4, 5, 6, 7)
一个无限长的清单在哪里。
多少是太多(在订单的情况下)?
更新:我之所以问它是因为我有两个数据库。其中一个(只读)是项目的来源,另一个包含由操作员处理的项目。每次当操作员从只读数据库中请求新项目时,我都想排除已处理的项目。
我只是想知道列表中 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
我不确定优化器将如何处理这个问题,或者它是否会比你正在做的更快(取决于你的索引策略,我猜)。
数据库在同一台服务器上?如果是,您可以使用左连接进行多数据库查询并获取空值。(这里是一个例子:一次查询多个数据库)。否则,您可以创建一个存储过程,用字符串传递 id,然后用正则表达式将它们拆分。我有类似的问题,但在内存数据库和 postgres 数据库中。幸运的是我的情况是(在...)