データベースのサイズによっては、binary searchの価値があります。
基本的には、行のサブセットでMD5()
を実行するクエリを作成します。次に、バイナリ形式でツリーを歩いて、一致するセクションをスキップするだけで簡単です。ステップ:
検索の最初の3レベルを事前に計算してクライアントに送信します。
クライアントで、これらの3つのレベルを計算し、一致するものがあるかどうかを確認します。一致しないものでは、3つのレベル(一致していないレベルごとに14個のハッシュを計算する3)を計算し、サーバーに送り返します。
サーバーでは、次の3つのレベルを計算し、クライアントから送信されたものと比較します。不一致の行の次の3つのレベルを計算します。
行数が各制限内で1になるまで2-3を繰り返します。一度そこにいれば、あなたは違いを特定したので、サーバーからそれらを送信/要求すれば、完了です。
ここで、ダンプを送信する方が効率的です。 1行を変更した場合、約log(total_rows, 2) * (sizeofMD5 + 2)
バイトが転送されます(オーバーヘッドを除く)。したがって、100万行のテーブルの場合、変更された行を判断するために約352バイトの双方向データが必要になります。今度は、変更される行が増えるほど、使用するデータが増えます。
3つのバッチを選択しました。これは、余分なデータを処理することと、接続数でレイテンシを削減することの間に良いトレードオフがあるからです。限度内のすべての単一の行に依存して、単一のMD5を生成する
SELECT MD5(GROUP_CONCAT(row)) AS checksum FROM
(
SELECT 1 AS grouping, MD5(CONCAT(id, col2, col3)) AS row
FROM table
ORDER BY id ASC
WHERE id > ? AND id < ?
) AS a
GROUP BY grouping
:
さて、限りの行をハッシュするなど、あなたのような何かを行うことができます。 (他の方法もありますが、それはイラストです)。その後、0, count(rows)
でそれを呼び出して、テーブル全体を確認してからそこからチェーンを反復します。
これは、整数PKを持つテーブル(バイナリ検索の境界ウィンドウとして使用されるため)でのみ機能することに注意してください。しかし、同じ速度、効率、およびコードですべてのタイプの変更(マスター削除、スレーブ削除、マスター変更、スレーブ変更、マスター挿入、スレーブ挿入)を検出します。