这个子选择是在where子句之前还是之后执行的?

时间:2013-07-13 15:56:11

标签: mysql performance subquery

表A有500'000条记录:

id, text, created, b_id

表B有20'000条记录:

id, text

A.b_id is FK to b.id

所以,当我执行以下操作时:

SELECT text, created, (SELECT b.text FROM b WHERE b.id = A.b_id) FROM a WHERE created < now()

SELECT text, created, (SELECT b.text FROM b WHERE b.id = A.b_id) FROM a LIMIT 0,10

子选择是否会在WHERE子句之后执行,所以实际上只对记录where created < now() resp执行。只有在前十条记录上或者是否会在排除之前的每条记录上执行?

谢谢!

2 个答案:

答案 0 :(得分:2)

您应该了解SQL连接 - 例如:

SELECT a.text, a.created, b.text
FROM   a JOIN b ON b.id = a.b_id
WHERE  a.created < NOW()
LIMIT  0, 10

但是,要回答有关相关子查询的问题:

  

子选择是否会在WHERE子句之后执行,因此实际上只对创建的记录执行&lt; now()resp。只有前十条记录或者在排除发生之前是否会在每条记录上执行?

只有在应用了过滤器/限制后,父查询返回的记录才会评估子查询。

答案 1 :(得分:0)

子查询不会自行执行。整个查询将由查询规划器转换为更类似于具有外部联接的查询的内容。

因此,子查询不会针对来自其他表的每个记录执行,也不会针对中间结果的每个记录执行。它将与主查询结合执行一次。

查询计划的最终结果取决于您对表有哪些索引,以及表的统计信息告诉查询计划程序。