2010-09-04 96 views
0

我有以下查询:SQL查询替代为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 

这是有点慢,我想那是因为moves查询表在pokemon_moves表的每一行,而不是只符合WHERE条款的。写这个查询有什么更好的选择?

请注意,在这个(外部)表中的整数被存储为文本

回答

1

尝试使用内部连接,并把你的WHERE条件到JOIN语句。例如:

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

对订单子句进行整数铸造的文本看起来像红旗。您可能还想仔细检查以确保您的move.id和pokemon_moves.move_id列都有索引。 – tidwall 2010-09-04 16:42:50

+0

好建议,@jojaba。我认为,您的建议和'JOIN'更改的组合将显着提高查询的性能。 – 2010-09-06 22:14:16