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

时间:2015-02-19 22:11:39

标签: mysql comparison rows

我对SQL很陌生,所以我使用MySQL工作台,并且我有两个非常大的表(每个表大约900K行),我想比较这些表。请注意,两个表的行数相同。

每个表有16列,我只对比较几个列感兴趣。所以说这些表有DataID,a,b,c,d,e列,我想看看基于DataID的每一行的表c和表B中列c,d和e的值是否相同。

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

对于所有900k行,必须重复该过程,如果我能在某处写出结果,我想这会有所帮助。

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

4 个答案:

答案 0 :(得分:3)

首先,要返回具有相同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

如果您希望表中任何值(c,d或e)相同,请使用t1.c = t2.c or t1.d = t2.d or t1.e = t2.e子句中的WHERE。 要获取包含所有不同值的表,请在WHERE子句t1.c <> t2.c AND t1.d <> t2.d AND t1.e <> t2.e中使用以下内容 要获得任何值不同的表,请使用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子句中的just值。

答案 1 :(得分:1)

如果我正确理解它,您只需要那些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中的主键,它甚至应该在大型数据集上快速。

答案 2 :(得分:0)

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

一个小片段就是

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

答案 3 :(得分:0)

您可以大量简化此任务,但您将阅读许多数据。如果没问题,只需执行2个SELECT,然后计算它们的MD5。然后你可以比较MD5。

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

\P md5sum
SELECT ...

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