为简单起见,我写一个这样的例子
select
a.xx,
a.xx,
... -- all table a's field
b.date,
b.money
c.date,
c.money,
d.date,
d.money,
e.date,
e.money
from
a
left join b on a.id = b.a_id
left join c on a.id = c.a_id
left join d on a.id = d.a_id
left join e on a.id = e.a_id
where ... -- some condition
limit 10
在此sql中,表b
和c
与表a
是一对一的
但是表d
和e
不是那样。
没有优化。表d
和e
看起来像这样
-- ... sql before
left join
(
select * from
(select * from d order by date desc) as temp
group by a_id
) as d on a.id = d.a_id
left join
(
select * from
(select * from e order by id desc) as temp
group by a_id
) as e on a.id = e.a_id
-- ... sql after
但是实际上,运行它非常慢。
表d
是一个新表,它还没有大量数据(将来会很大)。
表e
现在有百万。表e
的子查询使我的SQL非常慢。如何优化呢?