Альтернатива / оптимизация SQL-запроса для LEFT OUTER JOIN - PullRequest
0 голосов
/ 04 сентября 2010

У меня следующий запрос:

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 Ответ

1 голос
/ 04 сентября 2010

Попробуйте использовать INNER JOIN и поместите ваши условия 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
...