Tenir compte une vue composée de plusieurs tables ... par exemple un , qui se compose des tables car
réunis sur body
, engine
, wheels
et stereo
. Il pourrait ressembler à ceci:Optmizing MySQL GROUP BY ou sur de grandes vues DISTINCT
v_active_cars
vue
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
Chaque composant de la voiture a un drapeau « actif ». Maintenant, je dois trouver tous les stéréos disponibles dans les voitures actives. Pour ce faire besoin d'utiliser l'ensemble de la vue, pas seulement la table stereo
- juste parce qu'une chaîne stéréo est active ne signifie pas qu'il est disponible dans une voiture.
Je peux faire
SELECT DISTINCT stereo_id FROM v_active_cars
Même si cela peut revenir un très petit nombre de lignes, il est Stil une requête très lente.
J'ai essayé, mais il est encore plus lent:
SELECT stereo_id FROM stereo WHERE EXISTS
(SELECT 1 FROM v_active_cars WHERE stereo_id = stereo.stereo_id)
Y at-il autre chose que je pouvais faire pour rendre ce plus rapide?
Veuillez indiquer combien de lignes chaque table contient et combien de temps dure la requête. – Quassnoi
yeh, quelques idées sur les nombres dans chaque table active et non active, et le nombre que vous revenez de votre vue. Si ses millions et prend quelques secondes, alors cela peut être tout ce que vous pouvez espérer, si ses centaines et prend quelques minutes, alors il peut y avoir quelque chose de mal –