比较大型MySQL表

时间:2017-06-08 11:22:04

标签: mysql

我需要在两个(或更多)表之间进行比较,其中包含大约60,000行和大约60列。

在这些表中,我有两个值要运行查询。查询的目的是根据行中的两个值计算TABLE_A中存在但不存在于TABLE_B中的行。

我运行了以下查询:

SELECT id
FROM table_a ta
WHERE NOT EXISTS (
  SELECT id
  FROM table_b tb
  WHERE ta.value1=tb.value1 AND ta.value2=tb.value2
)

如上所述,我已尝试过上面的代码及其中的一些变体。但要运行此查询,它需要很长时间才能完成。我希望找到一个在10秒内运行的解决方案。

我试过的下一个查询,我认为其中有效:

SELECT value1, value2
FROM (
    SELECT ta.value1, ta.value2
    FROM table_a ta
    UNION ALL
    SELECT tb.value1, tb.value2
    FROM table_b tb
) result
GROUP BY value1, value2
HAVING COUNT(*) = 1
ORDER BY value1

代码显示了两个表之间的所有差异。因此,如果valueX存在于TABLE_A中但不存在于TABLE_B中,则显示它,反之亦然。

因此,简而言之,我希望从TABLE_B中获取TABLE_B中的所有行,这些行基于行中的两个值。

希望有人能提供帮助,谢谢!

2 个答案:

答案 0 :(得分:3)

为什么不使用加入?

/* Create a table called NAMES */
CREATE TABLE NAMES(Id integer PRIMARY KEY, Name text, LastName text);
CREATE TABLE OTHERNAMES(Id integer PRIMARY KEY, Name text, LastName text);

/* Create few records in this table */
INSERT INTO NAMES VALUES(1,'Tom','Riddle');
INSERT INTO NAMES VALUES(2,'Lucy','I love');
INSERT INTO NAMES VALUES(3,'Frank','Frankly');
INSERT INTO NAMES VALUES(4,'Jane','Austen');
INSERT INTO NAMES VALUES(5,'Robert','Downey');

INSERT INTO OTHERNAMES VALUES(2,'Lucy','I love');
INSERT INTO OTHERNAMES VALUES(3,'Frank','Frankly');
INSERT INTO OTHERNAMES VALUES(4,'Jane','Austen');
INSERT INTO OTHERNAMES VALUES(5,'Robert','Downey');

select * from NAMES
LEFT JOIN OTHERNAMES on 
    NAMES.Name = OTHERNAMES.Name 
    AND Names.LastName = OTHERNAMES.LastName
where OTHERNAMES.id is null

在线查看http://sqlfiddle.com/#!9/640c53/1

如果使用LEFT JOIN右表中不存在的项将被替换为空条目,可以使用where过滤。

我不知道您的60.000数据库有多高效,但这通常对我有用。

答案 1 :(得分:0)

经过一些试验和错误后,我改进了第二块代码。我注意到我的表格中有一个额外的字段,我可以用来进一步过滤结果。

SELECT date, value1, value2
FROM (
    SELECT date, value1, value2
    FROM (
        SELECT ta.date, ta.value1, ta.value2
        FROM table_1 ta
        UNION ALL
        SELECT tb.date, tb.value1, tb.value2
        FROM table_2 tb
    ) filter
    GROUP BY value1, value2
    HAVING COUNT(*) = 1
) result
WHERE date='YYYY-MM-DD'

此代码在4秒内过滤结果。

无论如何,感谢大家的麻烦。