簡體   English   中英

diff 2 個大型數據庫表

[英]diff 2 large database tables

給定 2 個大表(想象數億行),每個表都有一個字符串列,你如何獲得差異?

查看開源 Percona 工具包 --- 特別是pt-table-sync實用程序。

其主要目的是將 MySQL 表與其副本同步,但由於其 output 是協調兩個表之間差異所需的 MySQL 命令集,因此很自然地適合兩個表。

它實際上在幕后所做的有點復雜,它實際上使用不同的方法,具體取決於它可以告訴你的表(索引等),但基本思想之一是它對塊進行快速 CRC32 校驗和索引,如果校驗和不匹配,它會更仔細地檢查這些記錄。 請注意,此方法比線性遍歷兩個索引並比較它們快得多。

不過,它只會讓你走上一段路。 因為生成的命令旨在將副本與其主副本同步,所以它們只是替換副本的所有不同記錄的當前內容。 換句話說,生成的命令會修改記錄中的all字段(不僅僅是已更改的字段)。 因此,一旦您使用pt-table-sync來查找差異,您需要將結果包裝在一些東西中,以通過比較記錄中的每個字段來檢查不同的記錄。

但是pt-table-sync完成了您已經知道的困難部分:檢測差異,非常快。 它寫在 Perl 中; 來源應提供良好的面包屑。

我會考慮在每個數據庫中的該列上創建一個索引,然后使用一個程序使用該列上的排序並行處理每個數據庫。 當您擁有相等的記錄時,它會在兩者中推進,並且在您發現它們不同步時(跟蹤不序列的記錄)在其中一個或另一個中推進。 索引的創建在時間和空間上都可能非常昂貴(至少最初是這樣)。 但是,如果您要繼續添加記錄,則保持更新可能不會增加太多開銷。 一旦你有了索引,你應該能夠處理線性時間的差異。 生成索引——假設你有足夠的空間——應該是一個 O(nlogn) 操作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM