13

リスト内のIDの量がクエリのパフォーマンスに影響を与えるかどうか疑問に思っています。

クエリの例:

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

(2, 4, 5, 6, 7)無限に長いリストはどこにありますか。

そして、いくつが多すぎますか(順序の文脈で)?

更新:私が2つのデータベースを持っているので私がそれを尋ねている理由。その上(読み取り専用)はアイテムのソースであり、もう1つはオペレーターによって処理されるアイテムを含みます。オペレーターが読み取り専用データベースから新しいアイテムを要求するたびに、すでに処理されているアイテムを除外したいと思います。

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 に答える