2

我正在尝试从两个表中选择数据。DBA 将表配置为第一个表假脱机记录 5 分钟,然后一个过程将数据移动到第二个表并清理假脱机。这不断重复。问题是我需要从两个表中选择数据。

到目前为止,这是我的查询:

select * from table1,table2 
where ( (table1.field>=DATE_SUB(UTC_TIMESTAMP(), INTERVAL 5 MINUTE))  
OR 
(table2.field>=DATE_SUB(UTC_TIMESTAMP(), INTERVAL 5 MINUTE)) )

单独搜索任何一个条件都很快,但是当我像上面那样将它们放在一起时,系统就停在那里并且变得没有响应。我只是好奇我做错了什么。我应该用工会来代替吗?

4

1 回答 1

4

您正在加入 2 个表而没有任何加入 where 子句,因此您正在提取 M*N 记录(笛卡尔积)。

换句话说,如果 table1 有 100 条匹配第一个条件的记录,而 table2 有 10,000 条记录,则您检索的是 1,000,000 条记录,而不是 10,100 条。最重要的是,您要检索的每条记录的大小都是 2 倍,因为它包括 table1 行中的所有字段 + table2 行中的所有字段,因此您不仅将行数增加了 100 倍(使用我的例如#s),您还将检索到的数据大小增加了 200 倍。

您想要的是使用 UNION 而不是联接。

select * from table1
where table1.field>=DATE_SUB(UTC_TIMESTAMP(), INTERVAL 5 MINUTE))  
UNION
select * from table2
where table2.field>=DATE_SUB(UTC_TIMESTAMP(), INTERVAL 5 MINUTE))  
于 2012-08-30T16:13:04.190 回答