2010-09-04 4 views
0

J'ai la requête suivante:requête SQL alternative/optimisation pour LEFT OUTER JOIN

SELECT 
    `pokemon_moves`.`pokemon_move_method_id`, 
    `pokemon_moves`.`level`, 
    `move`.`id`, 
    `move`.`name` 
FROM 
    `pokemon_moves` 
LEFT OUTER JOIN 
    `moves` `move` ON 
     `move`.`id` = `pokemon_moves`.`move_id` 
WHERE 
    `pokemon_moves`.`pokemon_move_method_id` < '4' AND 
    `pokemon_moves`.`pokemon_id` = '2' AND 
    `pokemon_moves`.`version_group_id` = '6' 
ORDER BY 
    CAST(`pokemon_moves`.`level` as INTEGER) ASC, 
    `move`.`name` ASC 

Il est un peu lent et je pense que c'est parce que la table moves est interrogé pour chaque ligne de la table pokemon_moves au lieu de seulement ceux qui sont conformes à la clause WHERE. Quelle serait une meilleure option pour écrire cette requête?

S'il vous plaît noter que les entiers dans ce tableau (externe) sont stockés sous forme de texte

Répondre

1

Essayez d'utiliser une INNER JOIN et mettre WHERE conditions dans l'instruction JOIN. Par exemple:

SELECT 
    `pokemon_moves`.`pokemon_move_method_id`, 
    `pokemon_moves`.`level`, 
    `move`.`id`, 
    `move`.`name` 
FROM 
    `pokemon_moves` 
INNER JOIN 
    `moves` `move` ON 
    `pokemon_moves`.`pokemon_id` = '2' AND 
    `pokemon_moves`.`version_group_id` = '6' AND 
    `pokemon_moves`.`pokemon_move_method_id` < '4' AND 
    `move`.`id` = `pokemon_moves`.`move_id` 
ORDER BY 
    CAST(`pokemon_moves`.`level` as INTEGER) ASC, 
    `move`.`name` ASC 
+1

La conversion du texte en nombre entier sur une clause de commande ressemble à un drapeau rouge. Vous pouvez également vérifier que vous avez un index sur vos deux colonnes move.id et pokemon_moves.move_id. – tidwall

+0

Bon conseil, @jojaba. Je pense que la combinaison de votre suggestion et des modifications 'JOIN 'améliorera considérablement les performances de la requête. –