【问题标题】:MySQL: Select all rows with not matching timestamps in two databasesMySQL:选择两个数据库中时间戳不匹配的所有行
【发布时间】:2013-07-04 14:11:49
【问题描述】:

我正在尝试比较不同数据库中的两个表(或寻找最佳方法)。

数据库一中的表:

id  int(11) 
lastmod int(11) 

数据库二中的表:

id          int(11) 
timestamp   int(11)     

两个表都有匹配的 id(id 在 db1 中不是唯一的。就像一个(db2)到多个(db1))和时间戳(但其他列不同)。但随着时间的推移,数据库二中的记录将被更新(数据在一个不重要的列中)。现在我需要查找记录(时间戳),比较 id,以查找我需要在数据库一中更新哪些记录。 问题还在于性能,因为两个表都有超过 5 000 000 条记录。 查找需要更新的记录的最佳方式(最佳方式)是什么?

【问题讨论】:

  • 您可以使用一些触发器实时更新它们。否则,您可以将一个表连接到另一个表并检查时间戳是否不同。
  • 由于某些原因,我不能使用触发器。你能告诉我连接查询的例子吗?

标签: mysql sql performance comparison


【解决方案1】:

假设id是两个表中的主键,那么以下应该是有效的:

select *
from db1.table t1 join
     db2.table t2
     on t1.id = t2.id and
        t1.lastmod <> t2.timestamp

请注意,这假设了两件事。首先,id 在每个表中都是唯一的,其次时间戳列不是NULL

编辑:

如果情况是您在t1 中进行了多次修改,并试图将结果与只有一行的t2 进行比较,则首先聚合t1 以获得最近的修改日期并从那里:

select *
from (select t1.id, max(t1.lastmod) as lastmod
      from db1.table t1
      group by t1.id
     ) t1 join
     db2.table t2
     on t1.id = t2.id and
        t1.lastmod <> t2.timestamp

如果您确实要在t1 中查找具有多个修改的记录,则将having count(*) &gt; 1 添加到子查询中。

【讨论】:

  • 如果 db1 中的 id 不是唯一的怎么办?像一个(db2)到多个(db1)
  • 谢谢!工作得很好:)
猜你喜欢
  • 2016-12-23
  • 2018-10-09
  • 2010-12-14
  • 2011-01-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-15
相关资源
最近更新 更多