【发布时间】:2009-02-10 17:00:33
【问题描述】:
考虑一个由多个表组成的视图...例如 v_active_car,它由表 car 连接到 body、engine、wheels 和 stereo 组成。它可能看起来像这样:
v_active_cars查看
SELECT * FROM car
INNER JOIN body ON car.body = body.body_id
INNER JOIN engine ON car.engine = engine.engine_id
INNER JOIN wheels ON car.wheels = wheels.wheels_id
INNER JOIN stereo ON car.stereo = stereo.stereo_id
WHERE car.active = 1
AND engine.active = 1
AND wheels.active = 1
AND stereo.active = 1
汽车的每个组件都有一个“活动”标志。
现在,我需要找到现役汽车中可用的所有立体声音响。
为此,需要使用整个视图,而不仅仅是 stereo 表 - 立体声处于活动状态并不意味着它可以在汽车中使用。
这样我就可以了
SELECT DISTINCT stereo_id FROM v_active_cars
尽管这可能会返回非常少的行数,但它仍然是一个非常慢的查询。
我试过了,但速度更慢:
SELECT stereo_id FROM stereo WHERE EXISTS
(SELECT 1 FROM v_active_cars WHERE stereo_id = stereo.stereo_id)
我还能做些什么来加快速度吗?
【问题讨论】:
-
请贴出每张表有多少行以及查询需要多长时间。
-
是的,关于每个表中的活跃和非活跃数字的一些想法,以及您从视图中返回的数字。如果它是数百万并且需要几秒钟,那么这可能就是你所希望的,如果它是数百并且需要几分钟,那么某个地方可能有问题
标签: mysql optimization group-by distinct performance