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

Попробуйте использовать INNER JOIN, и положить где условия в 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

+0

Хороший совет, @jojaba. Я думаю, что сочетание вашего предложения и изменений «JOIN» значительно улучшит производительность запроса. – 2010-09-06 22:14:16