2011-02-15 78 views
1

我們的主服務器(PHP/MySQL)上有一個數據庫,用於存儲通過網站更新的數據。我試圖找出將這些數據複製到本地SQLite數據庫(在android上運行)的最佳方法。由於移動互聯網速度的限制等,我將需要建立檢查,看看每一行是否需要更新。認爲每行的版本號可能是最好的解決方案。主MySQL數據庫反饋SQLite數據庫(Android)

這是什麼人民的想法?

感謝, 彌敦道

回答

1

會不會使用時間戳是更容易?只需獲取自特定時間以來更新的所有行。您需要複製多少數據?

1

根據數據庫的大小,binary search可能是值得的。

基本上,想出了一個在行子集上運行MD5()的查詢。然後就像以二進制方式沿着樹走下來一樣簡單,跳過那些匹配的部分。步驟:

  1. 預先計算搜索的前三個級別(左右),發送給客戶端。

  2. 在客戶端,計算這3個等級,檢查匹配。在那些不匹配的情況下,計算3個級別(每個非匹配級別3有14個散列值)併發送回服務器。

  3. 在服務器上,計算接下來的3個級別,並與客戶端發送的內容進行比較。計算未匹配行的下三個級別。

  4. 重複2-3,直到行數達到1爲止。一旦到了那裏,你已經識別出不同之處,所以從服務器發送/請求它們,你就完成了。

現在,爲什麼發送轉儲更高效?那麼,對於1行更改,將需要大約log(total_rows, 2) * (sizeofMD5 + 2)字節轉移(不包括開銷)。因此,對於一個100萬行的表格,它將花費大約352個字節的方向數據來確定更改的行。現在,更改的行越多,它將使用的數據就越多。

我選擇了3個批次,因爲這是處理額外數據之間的一個很好的折衷方案,並且可以通過連接數量減少延遲。

現在,只要散列行,你可以這樣做:

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 

這將產生一個MD5這取決於在極限每一行。 (還有其他方法,但這是一個例子)。然後用0, count(rows)作爲整體來檢查表,然後從那裏迭代鏈。

請注意,這隻適用於具有整數PK的表格(因爲它用作二進制搜索的邊界窗口)。但它將以相同的速度,效率和代碼檢測每種類型的變化(主刪除,從屬刪除,主變更,從屬變更,主插入,從屬插入)。