将行的子集从一个表复制到另一个表,在两列上进行过滤

时间:2011-09-28 22:25:04

标签: mysql sql performance

我有以下MySql表包含我的原始事件数据(大约150万行)

userId  | pathId  | other stuff....

我有userId, pathId的索引(约50,000个独特组合)

在我处理过程中,我确定了30,000个我不想要的userId, pathId值,但我确实希望保留原始的原始表。所以我想将所有行复制到已处理的事件表中,但与此30,000 userId, pathId值匹配的行除外。

我正在考虑的方法是将我不想要的行的30,000 userId,PathId值写入temp_table,然后执行以下操作:

[create table processed_table ...]
insert into processed_table 
   select * from raw_table r 
   where not exists (
       select * from temp_table t where r.userId=t.userid and r.pathId=t.pathId
   )

有关信息,processed_table通常最终只有raw_table的一半。

无论如何,这似乎有效但我的SQL技能有限,所以我的问题(最后)是 - 这是最有效的方法吗?

1 个答案:

答案 0 :(得分:4)

不,这不是最有效的。 Source

  

这就是为什么在MySQL中搜索缺失值的最佳方法是使用LEFT JOIN / IS NULL或NOT IN而不是NOT EXISTS。

以下是NOT IN的示例:

INSERT INTO processed_table 
SELECT *
FROM raw_table 
WHERE (userId, pathId) NOT IN (
    SELECT userId, pathId FROM temp_table
)

LEFT JOIN ... IS NULL

INSERT INTO processed_table 
SELECT *
FROM raw_table r
LEFT JOIN temp_table t
ON r.userId = t.userid AND r.pathId = t.pathId
WHERE t.userId IS NULL

但是,由于您的表非常小并且只有50,000行,因此您的原始查询可能足够快。