У меня есть таблица Companies и таблица Zipcodes, и я хочу получить самое маленькое подмножество идентификаторов companyID, прежде чем применять дополнительную обработку. Так часто я помещаю это во внутренний выбор, собирая идентификаторы компании в некотором условии WHERE, а затем выполняю агрегацию или вычисление (например, вычисление расстояния) снаружи.
По какой-то причине я не понимаю, почему этот внешний SELECT работает медленно, а внутренний запрос работает быстро.
Я знаю, что это связано с JOIN внутри. Потому что удаление это решает проблему. Каким-то образом MySQL выводит таблицы …
SELECT _i1.companyID FROM (
SELECT companyID
FROM Companies
JOIN Zipcodes ON Zipcodes.zipcode = Companies.companyZipcode
WHERE Companies.companyType = 'plumbing'
) _i1
Время: .8с
Без внешнего запроса: .00x секунд
Есть индексы на Zipcodes.zipcode
а также Companies.companyZipcode
а также Companies.companyType
а также Companies.companyID
это первичный ключ
Выполнение EXPLAIN показывает, что внешний запрос приводит к тому, что MySQL имеет тип select_type Derived вместо Simple.
Если у вас есть подзапросы, необходимо создать временную таблицу и вставить в нее данные.
Других решений пока нет …