Если для выполнения этого подзапроса требуется больше секунды, я бы сказал, что это связано с проблемой индексации, а не с самим запросом (конечно, если этот запрос не виден, то это несколько предположительно, я бы рекомендовал опубликоватьзапрос тоже).По моему опыту, 9/10 проблем с медленными запросами сводятся к неправильной индексации базы данных.
Убедитесь, что veggie_id, potato_id и carrot_id проиндексированы
Кроме того, если вы используете какие-либо объединения вПодзапрос mass_market, убедитесь, что столбцы, над которыми вы выполняете объединения, тоже проиндексированы.
Редактировать
Если индексация выполнена правильно, единственное другое решение, которое я могу себе представитьв верхней части моей головы это:
CREATE TEMPORARY TABLE tmp_veggies (potato_id [datatype], carrot_id [datatype]);
INSERT IGNORE INTO tmp_veggies (potato_id, carrot_id) select potatoes.veggie_id, carrots.veggie_id from [...] massive_market
RIGHT OUTER JOIN potatoes on massive_market.potato_id = potatoes.potato_id
RIGHT OUTER JOIN carrots on massive_market.carrot_id = carrots.carrot_id;
SELECT carrot_id FROM tmp_veggies
UNION
SELECT potato_id FROM tmp_veggies;
Таким образом, вы отменили запрос, поэтому он только один раз запускает массивный подзапрос, и UNION
происходит во временной таблице (которая будетбудет сброшено автоматически , но не до тех пор, пока соединение не будет закрыто , поэтому вы можете удалить таблицу вручную).
Вы можете добавить любые необходимые столбцы в оператор CREATE TEMPORARY TABLE
и SELECT