如何比较 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个循环。
我是 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个循环。