行が変更されたかどうかだけを知りたい場合は、次のクエリの方がおそらくどちらのクエリよりも高速です。
SELECT id FROM xxx WHERE changed > some_timestamp LIMIT 1
完全を期すために: にインデックスがあることを確認してくださいchanged
。
編集:わずかなパフォーマンスの改善
考えてみると、テーブルへのアクセスがまったくSELECT change
なくなるため、を選択する代わりにおそらく実行する必要があります。このクエリは、変更が行われたかどうかをすぐに教えてくれます。id
SELECT changed FROM xxx WHERE changed > some_timestamp LIMIT 1
1 つのテーブル行へのアクセスは非常に高速になるため、最初のクエリよりもわずかに高速である必要があります。
MAX(changed)
代わりに選択する必要がありますか?
を選択するMAX(changed)
と、Federico が示唆するように、ほぼ同じインデックス アクセス パターンが得られるはずです。インデックス内の最上位の要素を見つけることは、非常に安価な操作です。ある定数よりも大きい要素を見つけることは潜在的に安価であるため、どちらもほぼ同じパフォーマンスを持つはずです。いずれの場合も、インデックスがある場合に限り、非常に大きなテーブルでも両方のクエリが非常に高速になります。
最初に行が変更されたかどうかを確認してから、別の手順で行を取得する必要がありますか
いいえ。変更された行がない場合は、そのようなチェックSELECT id FROM xxx WHERE changed > some_timestamp
と同じくらい速くなり、個別に実行しても意味がありません。結果がある場合にのみ、動作が遅くなります。コストのかかる操作 ( などORDER BY
) を追加しない限り、パフォーマンスは (ほぼ) 取得される行数に比例するはずです。