Mysql 将行的子集从一个表复制到另一个表,对两列进行筛选

Mysql 将行的子集从一个表复制到另一个表,对两列进行筛选,mysql,sql,performance,Mysql,Sql,Performance,下面的MySql表包含我的原始事件数据(大约150万行) 我有一个关于userId和pathId的索引(大约50000个独特的组合) 在我的处理过程中,我识别了30000个不需要的userId、pathId值,但我确实希望保留原始表。因此,我想将所有行复制到已处理的事件表中,除了与此30000userId、pathId值匹配的行之外 我正在考虑的一种方法是将我不想要的行的30000userId,PathId值写入temp_表,然后执行如下操作: [create table processed_t

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

我有一个关于
userId和pathId的索引(大约50000个独特的组合)

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

我正在考虑的一种方法是将我不想要的行的30000
userId,PathId
值写入temp_表,然后执行如下操作:

[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技能有限,所以我的问题(最后)是-这是最有效的方法吗?

不,这不是最有效的方法

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

下面是一个
不在
中的示例:

INSERT INTO processed_table 
SELECT *
FROM raw_table 
WHERE (userId, pathId) NOT IN (
    SELECT userId, pathId FROM temp_table
)
左连接。。。为空

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
然而,由于您的表非常小,只有50000行,所以您的原始查询可能已经足够快了

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