如果已经存在于MySQL的结果集中,则跳过处理行

时间:2014-05-26 15:46:02

标签: mysql sql

我正在使用大数据并尝试优化我的查询。是否可以跳过处理结果集中已存在的行?

在我的查询中查看AHTUNG条评论。

CREATE TEMPORARY TABLE tmp_table AS
SELECT bg2.id, bg1.property4 -- may be select kuf1.id and then pull property4 for each row in result set? id is PK, but property4 isn't indexed
FROM big_table bg2
JOIN correlating_table cor
    ON  bg1.property4 = cor.id2

-- AHTUNG!: Many JOINs,AND & WHERE statements. But I have no need to do that 
-- if bg1.id is already present in result set

JOIN big_table bg2 
    ON bg1.property4 = cor.id1
WHERE bg1.property1 = bg2.property1 -- AND (in JOIN clause) vs WHEN
AND bg2.property2 = bg2.property2
AND bg1.property2 BETWEEN @from AND @to   
AND bg2.another_table_id NOT IN ( 
    SELECT DISTINCT k.id FROM big_table bg
    JOIN entities e ON bg.entity_id = e.id
    WHERE bg.property4 = bg1.property4 AND bg.property1  = bg1.property1
) 
GROUP BY bg2.id, bg1.property4;

1 个答案:

答案 0 :(得分:0)

有一种常见的误解,认为SQL的工作方式是阅读查询并逐步进行处理。

实际上,SQL的作用是读取整个查询并为其生成执行计划。然后,它执行计划。这意味着查询中的所有联接和分组以及其他逻辑都是执行计划的一部分。数据中是否存在值(通常)不会影响执行计划。

因此,您无法通过单个查询执行所需操作。您可以将逻辑分解为两个单独的查询,一个跳过存在的值,另一个查找新值。这可以提高性能,特别是如果新值很少并且通过处理大量数据来提高性能。或者,如果检查太昂贵,它可能会使性能变差。您必须尝试一下,看看系统上的数据会发生什么。