我有以下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技能有限,所以我的问题(最后)是 - 这是最有效的方法吗?
答案 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行,因此您的原始查询可能足够快。