如何比较 MySQL 中的两个非常大的表?

How to compare two very large tables in MySQL?

我是 SQL 的新手,所以我使用 MySQL workbench,并且我有两个非常大的 table(大约 900K 行每个),我想比较 tables。请注意,两个 table 的行数相同。

每个 table 有 16 列,我只对比较其中的几列感兴趣。所以说 tables 有 DataID、a、b、c、d 和 e 列,我想看看 table A 和 table B 基于 DataID 的每一行。

在每个 table 中,我有一个 DataID 列,它作为比较每个 table 中行的参考点,所以例如我想比较 [=DataID=444 中的行 table A 与 table B 中具有相同 DataID 的行,并查看我感兴趣的列是否相同。

必须对所有 90 万行重复该过程,我想如果我可以将结果写在某处会有所帮助。

如有任何帮助,我将不胜感激,如果我一直感到困惑,我很乐意回答任何问题。

您可以使用内部联接来比较数据

一个小片段是

SELECT table_A.a, table_B.a, ...... 
FROM table_A
INNER JOIN table_B
  ON table_A.DataID = table_B.DataID;

如果我的理解正确,您只需要那些 DataID、c、d 和 e 列具有相同值的记录。 在这种情况下,以下语句将为您提供结果:

SELECT TableA.DataID, 
TableA.c, 
TableA.d, 
TableA.e 
-- add any other columns to the selection list if needed

INTO result_table
FROM TableA 
INNER JOIN TableB
ON TableA.DataID = TableB.DataID
WHERE TableA.c = TableB.c
AND TableA.d = TableB.d
AND TableA.e = TableB.e

据我所知,没有比使用简单的 INNER JOIN 语句来解决这个问题更好的方法(从性能的角度来看)。 即使在巨大的数据集上它也应该很快,假设 DataID 是 TableA 和 TableB 中的主键。

首先,对于 return table 具有相同 DataID 且在 c、d、e 中具有所有相同值的行,使用以下查询:

SELECT 
t1.c, t2.c, t1.d, t2.d, t1.e, t2.e
FROM
table1 t1
    INNER JOIN
table2 t2 ON t1.DataId = t2.DataId
WHERE
t1.c = t2.c AND t1.d = t2.d
    AND t1.e = t2.e

如果您希望 table 任何值(c、d 或 e)相同,请在 WHERE 子句中使用 t1.c = t2.c or t1.d = t2.d or t1.e = t2.e。 要获得具有所有不同值的 table,请在 WHERE 子句 t1.c <> t2.c AND t1.d <> t2.d AND t1.e <> t2.e 中使用以下内容 要获得任何值不同的 table,请使用 WHERE 子句中的 t1.c <> t2.c OR t1.d <> t2.d OR t1.e <> t2.e
要保存结果,请使用以下查询:

INSERT INTO SaveTable SELECT 
t1.c, t2.c, t1.d, t2.d, t1.e, t2.e
FROM
table1 t1
    INNER JOIN
table2 t2 ON t1.DataId = t2.DataId
WHERE
t1.c <> t2.c AND t1.d <> t2.d AND t1.e <> t2.e

要在其他情况下添加插入值,只需修改 where 子句和 select 子句中的值即可。

你可以把这个任务简化很多,但是你会读到很多数据。如果没问题,只需执行 2 个 SELECT,并计算它们的 MD5。然后就可以比较MD5了。

从 Linux 上的命令行客户端获取 Md5 非常简单:

\P md5sum
SELECT ...

通过程序做的时间有点长,但毕竟只需要2个循环。