13

我只是想知道列表中 id 的数量是否会影响查询性能。

查询示例:

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

(2, 4, 5, 6, 7)一个无限长的清单在哪里。

多少是太多(在订单的情况下)?

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

4

4 回答 4

10

是的,列表中的 ID 数量会影响性能。例如,一个网络数据包只有这么大,数据库必须解析所有这些噪音并将其转化为一系列:

WHERE foo.ID <> 2
AND foo.ID <> 4
AND foo.ID <> 5
AND ...

您应该考虑其他方式让您的查询了解此集合。

于 2012-06-22T19:57:32.790 回答
4

这是对该查询的古怪重写,它可能会执行得更好一些

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>
于 2012-06-22T21:59:55.083 回答
3

只是为了好玩,鉴于您的更新,我将建议一个不同的策略:

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

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

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

于 2012-06-23T16:52:14.677 回答
0

数据库在同一台服务器上?如果是,您可以使用左连接进行多数据库查询并获取空值。(这里是一个例子:一次查询多个数据库)。否则,您可以创建一个存储过程,用字符串传递 id,然后用正则表达式将它们拆分。我有类似的问题,但在内存数据库和 postgres 数据库中。幸运的是我的情况是(在...)

于 2015-06-14T17:28:04.597 回答