Я пытаюсь ускорить этот запрос:
SELECT order.id
FROM (
SELECT o.id
FROM `order` as `o`
INNER JOIN order_item as oi on
oi.order_id = o.id
AND `o`.`canceled` = 0
AND ( `o`.`return_date` > "2011-03-14" OR oi.checked = 0 OR '2011-03-14' < oi.last_update)
) as `order`
Время составляет 0,0930 секунды. Подзапрос (SELECT * FROM order
as o
...) на собственные часы за 0,0005 секунд. Таблица, в которой я тестирую, содержит около 10000 строк, 43 строки возвращаются из подзапроса where-clause.
Кроме ускорения запроса, мне бы очень хотелось, чтобы кто-нибудь объяснил мне, почему запрос становится более чем в 100 раз медленнее, когда я заключаю его в другой запрос?
MySql объяснил мне, что подзапрос сам выбирает сначала o
, а затем oi
. MySql объяснение для всего запроса сначала выбирает (что является производным 2?), Затем o
и oi
в этом порядке.
Я бы хотел, чтобы подзапрос был подзапросом, потому что я делаю много соединений, которых нет в предложении where (которое я исключил из кода и тестов). Если бы я использовал подзапрос самостоятельно, с соединениями, запрос был бы еще медленнее.
Любая помощь будет высоко ценится. Я искал ответы, но не могу их найти, и это может быть просто потому, что я не знаю, что искать, если да, то я прошу прощения.