2010-09-04 97 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