我有这些 SQL 查询:
EXPLAIN ANALYZE
SELECT
* ,
(
SELECT COUNT(*) FROM orders
WHERE orders.customer_id = customers.id
) as orders_count
FROM customers
LIMIT 10
该查询的执行计划:
EXPLAIN ANALYZE
SELECT
* ,
(
SELECT COUNT(*) FROM orders
WHERE orders.customer_id = customers.id
) as orders_count
FROM customers
ORDER BY id
LIMIT 10
该查询的执行计划:
EXPLAIN ANALYZE
SELECT
* ,
(
SELECT COUNT(*) FROM orders
WHERE orders.customer_id = customers.id
) as orders_count
FROM customers
ORDER BY orders_count
LIMIT 10
该查询的执行计划:
如何从这些查询和执行计划中知道子查询“orders_count”何时被计算并分配给表中的每一行,以及何时仅限于前 10 行?
鉴于客户表中存在大量记录,我的目标是注释尽可能少的行,而不是注释所有数百万条记录。
在解释计划中,第 5 行(最后一行为第 8 行)显示 rows=10,因此看起来 SQL 计划程序能够在子查询中使用该限制。不过,我们看不到该线上的循环数,因此这不是确定的。
然而,第三个在第 7 行显示聚合需要 10000 个循环。由于订单需要子查询,因此没有办法限制它而不计算整个表。