我有一个表格(table1
),其中包含用户ID和交易日期(stt_stid
,stt_date
)以及其他一些不相关的信息。
我有另一张表(table2
),其中包含几百条记录,我需要根据min(stt_date)
获取table1.stt_stid = table2.stid
。
table1
是5M +行,我在编写有效连接时遇到问题而没有收到错误。
我尝试过以下方面:
UPDATE table2 JOIN (
SELECT stt_stid,
MIN(stt_date) AS mindate
FROM table1
WHERE stt_amt > 0
AND stt_prid = 1
GROUP BY stt_stid) temp
ON table2.stid = table1.stt_stid
SET table2.firstdate = temp.mindate
答案 0 :(得分:1)
如果该内联视图查询应该引用table1
,请确保已定义索引
ON table1 (stt_stid, stt_date)
这将允许MySQL使用索引来满足查询。如果MySQL不能使用索引来满足GROUP BY并获得最小值,那么在table1
中的所有行上都需要“使用filesort”操作,这对于大型集合而言是昂贵的。 (MySQL可以使用合适的索引来避免该操作。)
内联视图查询的结果将实现为“派生表”,然后外部查询将运行。在MySQL 5.6之前,“派生表”上没有任何索引。
(我假设stid
中几乎每个table1
值也出现在table2
中,也就是说,table2
不包含非常小的子集stid
值...如果不是这样,将JOIN移动到派生表中可能会显着减小派生表的大小。)