0

表 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()。仅在前十条记录上执行,还是在排除发生之前对每条记录执行?

谢谢!

4

2 回答 2

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 子句之后执行,所以实际上只在 created < now() resp 的记录上执行。仅在前十条记录上执行,还是在排除发生之前对每条记录执行?

在应用过滤器/限制后,子查询只会针对父查询返回的那些记录进行评估。

于 2013-07-13T16:01:03.500 回答
0

子查询不会自行执行。整个查询将由查询计划器转换为更类似于带有外连接的查询。

因此,不会对另一个表中的每条记录或中间结果的每条记录执行子查询。它将与主查询一起执行一次。

查询计划的最终结果取决于表上的索引以及表的统计信息告诉查询计划者的内容。

于 2013-07-13T16:12:38.650 回答