select
/*+ INL_JOIN(a) */
* from (
select ID,CRAD from table_a ) a
left join (
select /*+ NO_DECORRELATE() */ ID,
count(1) cn from table_b group by ID
)b on a.ID=b.ID
where a.CRAD='123'
SELECT
a.ID,
a.CRAD,
IFNULL(b.cn, 0) AS cn – 左连接补 NULL 为 0,更友好
FROM table_a a
LEFT JOIN (
– 先关联过滤后的 a.ID,再聚合,减少计算量
SELECT
b.ID,
COUNT(1) AS cn
FROM table_b b
INNER JOIN table_a a_filter ON b.ID = a_filter.ID
WHERE a_filter.CRAD = ‘123’ – 提前过滤,缩小 table_b 聚合范围
GROUP BY b.ID
) b ON a.ID = b.ID
WHERE a.CRAD = ‘123’; – 提前过滤 table_a,只取需要的行
– 给 table_a 建立覆盖索引(CRAD 过滤 + ID 关联,无需回表)
CREATE INDEX idx_table_a_crad_id ON table_a (CRAD, ID);
– 给 table_b 建立分组/关联的索引(加速 COUNT 聚合)
CREATE INDEX idx_table_b_id ON table_b (ID);