基于多列获取两个 MySQL 表差异的有效方法是什么?
What is an efficient way to get a diff of two MySQL tables based on several columns?
我正在尝试将我已有的数据(库存列表)与每日更新进行协调,这是具有相同布局的 table;我只需要在当前 table 的四个字段中的任何一个中有差异的行(不考虑其他字段中的差异。)
我现在做的是:
insert into diff
select * from new n
where concat(n.distrib_pn, n.available_total, n.cost, n.map) not in
(select concat(c.distrib_pn, c.available_total, c.cost, c.map) from current c);
非常慢:两个约 7,000 行的文件约 35 秒。new
、current
和 diff
table 在 [=15 上建立索引=].我也试过在不使用 concat()
的情况下执行此操作,但无法弄清楚语法。
这样会更快,但不一定快。
select n.*
from new n left join current c
on concat(n.distrib_pn, n.available_total, n.cost, n.map)
= concat(c.distrib_pn, c.available_total, c.cost, c.map)
where c.distrib_pn is null
它之所以更快是因为您没有使用 not in
。加入函数结果会减慢速度。但是,根据您的查询要完成的任务,这可能是唯一的方法。
您可以使用连接查询来执行此操作:
insert into diff
select n.* from new n inner join current c on
n.distrib_pn != c.distrib_pn and
n.available_total != c.available_total and
n.cost != c.cost and
n.map != c.map;
我正在尝试将我已有的数据(库存列表)与每日更新进行协调,这是具有相同布局的 table;我只需要在当前 table 的四个字段中的任何一个中有差异的行(不考虑其他字段中的差异。)
我现在做的是:
insert into diff
select * from new n
where concat(n.distrib_pn, n.available_total, n.cost, n.map) not in
(select concat(c.distrib_pn, c.available_total, c.cost, c.map) from current c);
非常慢:两个约 7,000 行的文件约 35 秒。new
、current
和 diff
table 在 [=15 上建立索引=].我也试过在不使用 concat()
的情况下执行此操作,但无法弄清楚语法。
这样会更快,但不一定快。
select n.*
from new n left join current c
on concat(n.distrib_pn, n.available_total, n.cost, n.map)
= concat(c.distrib_pn, c.available_total, c.cost, c.map)
where c.distrib_pn is null
它之所以更快是因为您没有使用 not in
。加入函数结果会减慢速度。但是,根据您的查询要完成的任务,这可能是唯一的方法。
您可以使用连接查询来执行此操作:
insert into diff
select n.* from new n inner join current c on
n.distrib_pn != c.distrib_pn and
n.available_total != c.available_total and
n.cost != c.cost and
n.map != c.map;