考慮由多個表的視圖...例如,其由表car
的接合到body
,engine
,wheels
stereo
和。它可能是這個樣子:Optmizing MySQL的GROUP BY或DISTINCT上大的觀點
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)
還有什麼我能做的,使這個更快?
請發佈每個表有多少行以及查詢需要多長時間。 – Quassnoi 2009-02-10 17:13:39
你好,關於每張桌子上的號碼有一些主動和非主動的想法,以及你從視圖中得到的號碼。如果它的成千上萬秒的時間,那麼這可能是所有你可以期望的,如果它的數百並且需要幾分鐘,那麼在某處可能有些問題 – 2009-02-10 17:19:39