0

異なるデータベースの 2 つのテーブルを比較しようとしています (またはこれを行うための最良の方法を探しています)。

データベース 1 のテーブル:

id  int(11) 
lastmod int(11) 

データベース 2 のテーブル:

id          int(11) 
timestamp   int(11)     

両方のテーブルには、一致する ID (id は db1 で一意ではありません。1 つ (db2) から多数 (db1) のように) とタイムスタンプ (ただし、他の列は異なります) があります。しかし、時間の経過とともに、データベース 2 のレコードが更新されます (1 つの重要でない列のデータ)。次に、ID を比較してレコード (タイムスタンプ) を検索し、データベース 1 で更新する必要があるレコードを見つける必要があります。両方のテーブルに 5 000 000 を超えるレコードがあるため、パフォーマンスにも問題があります。更新が必要なレコードを見つける最善の方法 (最適な方法) は何ですか?

4

1 に答える 1

2

それが両方のテーブルの主キーであると仮定するidと、次のことが効率的になります。

select *
from db1.table t1 join
     db2.table t2
     on t1.id = t2.id and
        t1.lastmod <> t2.timestamp

これは 2 つのことを前提としていることに注意してください。まず、idは各テーブルで一意であり、次にタイムスタンプ列は一意ではありませんNULL

編集:

に複数の変更があり、行が 1 つしかない とt1結果を比較しようとしている場合は、最初に集計して最新の変更日を取得し、そこから処理を進めます。t2t1

select *
from (select t1.id, max(t1.lastmod) as lastmod
      from db1.table t1
      group by t1.id
     ) t1 join
     db2.table t2
     on t1.id = t2.id and
        t1.lastmod <> t2.timestamp

で複数の変更を含むレコードを本当に探している場合は、サブクエリt1に a を追加します。having count(*) > 1

于 2013-07-04T14:30:39.043 に答える