在大型视图上选择MySQL GROUP BY或DISTINCT

考虑一个由几个表组成的视图……例如v_active_car,它由连接到车身,发动机,车轮和立体声的车辆组成.它可能看起来像这样:

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

汽车的每个部件都有一个“活动”标志.
现在,我需要找到活动车中可用的所有立体声音响.
要做到这一点,需要使用整个视图,而不仅仅是立体声表 – 只是因为立体声是活跃的并不意味着它可以在汽车中使用.

所以我能做到

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)

我还能做些什么来加快速度吗?

最佳答案 >确保所有JOIN都有索引

>在您的情况下,每个级别都由一个键和一个标志选择.将标志添加为索引的一部分可能允许DB仅使用索引,而不是读取整个记录
>确保您有足够的RAM来保存结果集.特别是InnoDB表有很多旋钮需要调整.大多数默认值假设非常旧的硬件和太少的RAM.

点赞