【发布时间】:2014-07-08 15:42:17
【问题描述】:
我没有太多使用 JOIN 的经验,也不是 MySQL 方面的专家。
我想要做的是在执行 JOIN 之前对两个表进行 SELECT。为此,我尝试使用括号,但语法不正确。
例如,在 JOIN 之前不做 SELECT:
DELETE tbA.* FROM tbA
INNER JOIN tbB
ON tbA.id_tbB = tbB.id_tbB
WHERE tbB.dateCol<'2014-01-01 00:00:00'
这可行,但需要太多时间。我正在尝试做的事情,但没有成功,是这样的:
DELETE tbA.* FROM (SELECT * FROM tbA WHERE tbA.id_tbB<=id_max)
INNER JOIN (SELECT * FROM tbB WHERE tbB.id_tbB<=id_max)
ON tbA.id_tbB = tbB.id_tbB
WHERE tbB.date<'2014-01-01 00:00:00'
我试图将其综合到基本问题中......如果有人认为我应该提供更多信息(我想要做什么,索引,外键......)我很乐意这样做,但基本上我只想知道如何在 INNER JOIN 之前对两个表进行 SELECT。
我想这样做是因为我的表有大量记录(表 A ~ 1 亿,表 B ~ 40000)。之前进行选择会将两个表上的记录量减少到 10%,并有望显着减少 INNER JOIN,从而减少整体查询。
谁能指出错误?谢谢!
【问题讨论】:
-
如何将 where 子句移到 join 本身?我不确定执行计划是否正在执行连接(大笛卡尔),然后在连接之前发生过滤或过滤......例如
DELETE tbA.* FROM tbA INNER JOIN tbB ON tbA.id_tbB = tbB.id_tbB and tbB.dateCol<'2014-01-01 00:00:00' -
感谢您的评论。但是,在您的建议中,我没有看到将数据减少到 10% 的条件 (tbB.id_tbB
标签: mysql select join inner-join