2016-02-22 55 views
0

我正在研究一個數據庫系統,其中有一個主表bd &表和許多從屬表,並且銷售需要從主表中同步它們的數據。MySQL行散列

關於這種安排的一些觀點: 1)slave db(S)會不時脫機,所以當他們再次起牀時,服務會「同步」它們。 (所以沒有複製) 2)我不能改變主數據庫,所以不觸發。 (想象主數據庫不屬於我) 3)同步將發生在一個服務和速度並不重要。 4)沒有大量的數據 - 所以我甚至可以走過每一行。 5)行中的數據變化很大,從varchar(3)到varchar(500)

我四處張望,發現Md5() - 這個我覺得很棒,因爲那時我可以只用CONCACT()行值和行對行比較。我發現的問題是CONCAT(和GROUP_CONCAT)有一點限制,因爲它有一個字符限制。

獲得「排」CHECKSUM或HASH的最佳方式是什麼?

CHECKSUM ROW WHERE id = 1會很棒......最接近這個的是什麼?

更新: 我設法得到該「SELECT @@ group_concat_max_len;」返回最大值(4294967295)。但是這個代碼仍然不起作用:

SELECT id, MD5(GROUP_CONCAT(MD5(`id`), ...many columns here... ,MD5(`col30`))) AS 'md5Hash' FROM company_table GROUP BY id; 

它仍然只適用於少數幾列。

+1

您可以使用'group_concat_max_len'變量增加'group_concat'的字符數限制,有效地使它與系統最大限度地支持的一樣大。 – bishop

+0

如果它是一個服務,你可以處理服務中的所有內容,並且如果你不能像bishop建議的那樣設置'group_concat_max_len',就可以在代碼中連接的返回結果上運行散列。正如你所說的,速度無關緊要,這將爲你帶來理想的結果。 –

+0

考慮到你的要求和限制,用MD5(GROUP_CONCAT(..))進行哈希處理似乎對我來說很合理。特別是,請參閱[這個答案](http://stackoverflow.com/a/26733784/2908724)。作爲@FrankJ建議的代碼級解決方案最終可能是最好的方法,因爲它將比數據庫級別的內存更靈活。 – bishop

回答

0

好吧,我要回答這個問題,因爲我覺得我已經得到足夠的了。

因此,原來是這樣的:

SELECT id, MD5(CONCAT(IF(col1,CRC32(col1),CRC32('')), ... ,IF(col20,CRC32(col20),CRC32('')))) AS 'md5has' FROM table 

導致在字符串CONCAT量最少,因爲CRC32只能產生高達10位值(4,294,967,295),所以即使CONCAT或group_concat max是1024,我們可以產生10位數字的CRC,然後我們可以在一個通道中散列一行102列。

最好的選擇是構建一個多遍系統,用於多次傳遞超過102列的表。

有一點腰部飽滿,但仍然更好,然後哈希客戶端... IO節省仍然是巨大的,除了誰使桌102列?!