0

前回のチェック以降に更新された行があるかどうかを確認しようとしています。他に良い代替品があれば知りたいです

"SELECT id FROM xxx WHERE changed > some_timestamp;"

ただし、200,000行以上あるため、かなり速く重くなる可能性があります...カウントはもっと良いでしょうか?

"SELECT count(*) FROM xxx WHERE changed > some_timestamp;"

単体テストを作成することを考えましたが、まだこれが得意ではありません /:

助けてくれてありがとう!


編集:多くの場合、変更された行がないため、常に最初に MAX(xx) でテストし、指定された古い更新タイムスタンプよりも大きい場合は、クエリを実行することをお勧めしますか?

4

2 に答える 2

1

some_timestamp にインデックスを作成して実行します。

SELECT MAX(some_timestamp) FROM xxx;

テーブルが MyISAM の場合、クエリはすぐに実行されます。

于 2013-04-24T23:42:15.197 に答える
1

行が変更されたかどうかだけを知りたい場合は、次のクエリの方がおそらくどちらのクエリよりも高速です。

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) を追加しない限り、パフォーマンスは (ほぼ) 取得される行数に比例するはずです。

于 2013-04-24T21:40:45.130 に答える