これが私の設定です:
テーブルrecords
には、他のいくつかの列とともに複数(2つ以上)のPKID列が含まれています。
テーブルcached_records
には2つの列しかありません。これは、の2つのPKIDと同じですrecords
。
たとえば、records
PKIDが「keyA」、「keyB」、および「keyC」であり、「keyA」と「keyB」cached_records
のみがあると仮定します。
records
適切なPKID(つまり、「keyA」と「keyB」)がテーブルにないテーブルから行をプルする必要がありcached_records
ます。
PKIDを1つだけ使用していた場合、このタスクがどれほど簡単になるかを知っています。
SELECT
pkid
FROM
records
WHERE
pkid NOT IN (SELECT pkid FROM cached_records)
ただし、PKIDが2つあるということは、単純なを使用できないことを意味しNOT IN
ます。これは私が現在持っているものです:
SELECT
`keys`.`keyA` AS `keyA`,
`keys`.`keyB` AS `keyB`
FROM
(
SELECT DISTINCT
`keyA`,
`keyB`
FROM
`records`
) AS `keys`
LEFT JOIN
`cached_records` AS `cached`
ON
`keys`.`keyA` = `cached`.`keyA`
AND
`keys`.`keyB` = `cached`.`keyB`
WHERE
(
`cached`.`keyA` IS NULL
AND
`cached`.`keyB` IS NULL
)
(テーブルDISTINCT
から複数のPKIDのうち2つしか取得してrecords
いないため、重複する可能性があり、実際には重複する必要がないため、これが必要です。「keyC」は使用されておらず、レコードの一意性を判断するのに役立ちます)。
上記のこのクエリは問題なく機能しますが、cached_records
テーブルが大きくなるにつれて、クエリの処理にかかる時間が長くなります(ここで数分話しているのですが、コードがハングしてクラッシュするのに十分な時間がかかる場合があります)。
したがって、この種の操作(行が別のテーブルに存在しないテーブルから行を選択する)を1つではなく複数のPKIDSで実行するのが最も効率的な方法は何でしょうか...