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

如何比较MySQL中的两个非常大的表?,mysql,comparison,rows,Mysql,Comparison,Rows,我对SQL非常陌生,所以我使用的是MySQL workbench,我有两个非常大的表(每个表大约900K行),我想比较这些表。注:两个表的行数相同 每个表有16列,我只对比较其中的几列感兴趣。假设表中有列DataID,a,b,c,d,e,我想看看列c,d和e中的值是否与表a和表b中基于DataID的每一行中的值相同 在每个表中,我都有一个DataID列,它作为比较每个表中的行的参考点,因此,例如,我想将表a中DataID=444的行与表B中DataID相同的行进行比较,看看我感兴趣的列是否相同

我对SQL非常陌生,所以我使用的是MySQL workbench,我有两个非常大的表(每个表大约900K行),我想比较这些表。注:两个表的行数相同

每个表有16列,我只对比较其中的几列感兴趣。假设表中有列DataID,a,b,c,d,e,我想看看列c,d和e中的值是否与表a和表b中基于DataID的每一行中的值相同

在每个表中,我都有一个DataID列,它作为比较每个表中的行的参考点,因此,例如,我想将表a中DataID=444的行与表B中DataID相同的行进行比较,看看我感兴趣的列是否相同

这个过程必须对所有900k行重复,我想如果我能把结果写在某个地方会有所帮助


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

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

一个小片段将是

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

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

一个小片段将是

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
就我所知,没有比使用一个简单的内部连接语句更好的方法(从性能的角度来看)来解决这个问题。
假设DataID是TableA和TableB中的主键,即使在大型数据集上也应该很快。如果我理解正确,您只需要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
就我所知,没有比使用一个简单的内部连接语句更好的方法(从性能的角度来看)来解决这个问题。
假设DataID是TableA和TableB中的主键,即使在大型数据集上也应该很快。首先,要返回具有相同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
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
若你们想要一个任何值(c,d或e)都相同的表,那个么在
where
子句中使用
t1.c=t2.c或t1.d=t2.d或t1.e=t2.e
。 要获得具有所有不同值的表,请在
WHERE
子句
t1.ct2.c和t1.dt2.d和t1.et2.e
要获取任何值不同的表格,请在
where
子句
t1.ct2.c或t1.dt2.d或t1.et2.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
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
插入存储表选择
t1.c,t2.c,t1.d,t2.d,t1.e,t2.e
从…起
表1 t1
内连接
表2 t1.DataId=t2.DataId上的t2
哪里
t1.ct2.c和t1.dt2.d和t1.et2.e

若要在其他情况下添加insert值,只需在
select
子句中修改where子句和just值。

首先,若要返回具有相同数据ID且在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
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
若你们想要一个任何值(c,d或e)都相同的表,那个么在
where
子句中使用
t1.c=t2.c或t1.d=t2.d或t1.e=t2.e
。 要获得具有所有不同值的表,请在
WHERE
子句
t1.ct2.c和t1.dt2.d和t1.et2.e
要获取任何值不同的表格,请在
where
子句
t1.ct2.c或t1.dt2.d或t1.et2.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
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
插入存储表选择
t1.c,t2.c,t1.d,t2.d,t1.e,t2.e
从…起
表1 t1
内连接
表2 t1.DataId=t2.DataId上的t2
哪里
t1.ct2.c和t1.dt2.d和t1.et2.e

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

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

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

\P md5sum
SELECT ...

通过程序执行有点长,但毕竟,您只需要两个循环。

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

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

\P md5sum
SELECT ...

通过程序执行有点长,但毕竟,您只需要两个循环。

嘿,好了。我们很乐意为您提供一些代码以供构建。您当前的查询是什么样子的?您好,除了使用简单的select语句之外,我对SQL不是非常精通。我想我已经知道需要做什么了:我必须查看A中的DataID=B中的DataID的每个表,然后比较我感兴趣的列中的值是否相同。最后,我想显示数据ID中不同行的位置。我们很乐意为您提供一些代码以供构建。您当前的查询是什么样子的?您好,除了使用简单的select语句之外,我对SQL不是非常精通。我想我已经知道需要做什么了:我必须查看A中的DataID=B中的DataID的每个表,然后比较我感兴趣的列中的值是否相同。最后,我想显示数据ID中不同行的位置。您的插入语法有错误。请看下面我的答案。是的,但是我没有编辑它,因为您已经添加了答案,只需一句小小的注释:为什么要插入A表和B表中的列,而它们在所有这些列中都具有相同的值?我认为如果我们只存储TableATrue中的列,会节省一些空间和时间,我在写插入文章时考虑了所有不同的值,这样会更相关。插入语法有错误。请看下面我的答案。是的,但是我没有编辑它,因为您已经添加了答案,只需一句话:为什么是您