2011-02-15 19 views
1

ウェブサイトを通じて更新されたデータを保存するマスターサーバー(PHP/MySQL)にデータベースがあります。私はこのデータをローカルのSQLiteデータベース(アンドロイド上で実行中)にコピーする最良の方法を見つけようとしています。モバイルインターネットの速度などの制約のため、私は、各行の更新が必要かどうかをチェックするために構築する必要があります。各行のバージョン番号は最善の解決策かもしれないと考えました。SQLite DBを流すマスターMySQL DB(Android)

これに関する人々の考えは何ですか?

おかげで、 ネイサン

答えて

1

容易になり、タイムスタンプを使用していませんか?特定の時間から更新されたすべての行を取得するだけです。どのくらいのデータをコピーする必要がありますか?

1

データベースのサイズによっては、binary searchの価値があります。

基本的には、行のサブセットでMD5()を実行するクエリを作成します。次に、バイナリ形式でツリーを歩いて、一致するセクションをスキップするだけで簡単です。ステップ:

  1. 検索の最初の3レベルを事前に計算してクライアントに送信します。

  2. クライアントで、これらの3つのレベルを計算し、一致するものがあるかどうかを確認します。一致しないものでは、3つのレベル(一致していないレベルごとに14個のハッシュを計算する3)を計算し、サーバーに送り返します。

  3. サーバーでは、次の3つのレベルを計算し、クライアントから送信されたものと比較します。不一致の行の次の3つのレベルを計算します。

  4. 行数が各制限内で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を持つテーブル(バイナリ検索の境界ウィンドウとして使用されるため)でのみ機能することに注意してください。しかし、同じ速度、効率、およびコードですべてのタイプの変更(マスター削除、スレーブ削除、マスター変更、スレーブ変更、マスター挿入、スレーブ挿入)を検出します。