Возможно, 20% не так уж плохо? (особенно, если это только для короткого пакета). По его мнению, для получения результата может потребоваться множество данных.
Я попытался объединить скопления на столе newLoads
в один SELECT и в итоге оказался чем-то (очень) похожим на то, что у Рика Джеймса уже было. Дополнительным преимуществом моей конструкции является то, что она больше соответствует исходному запросу в случае отсутствия соответствующей информации в newLoads и/или когда в одном из полей есть нуль. (Я думаю, на самом деле не проверить это)
SELECT c.name, c.billingaddress, c.billingcity, c.billingstate, c.billingzip, c.ifActive, agg.numberLoads, agg.RPM
FROM `companies` c
LEFT OUTER JOIN ((SELECT l.idCompany,
numberLoads = COUNT(l.id),
RPM = (CASE WHEN SUM((CASE WHEN l.loadRate <> '0' AND l.esMiles <> '0' THEN 1 ELSE 0 END)) = 0 THEN NULL ELSE
SUM((CASE WHEN l.loadRate <> '0' AND l.esMiles <> '0' THEN l.loadRate ELSE 0 END))/SUM((CASE WHEN l.loadRate <> '0' AND l.esMiles <> '0' THEN l.esMiles ELSE 0 END))
END)
FROM newLoads l
WHERE l.smallStatus = '1'
) AS agg
ON agg.idCompany = c.id
WHERE c.ifContractor = '0' $cond
ORDER BY agg.numberLoads DESC;
Во всяком случае, если продолжительность является проблемой, вы можете проверить, если у вас есть (соединение) индексы на соответствующих областях, как Гордон Линофф по праву предложенных, и также о том, что может быть в $cond
; вероятно, имеет смысл увидеть, какая фильтрация происходит там и какое влияние оно оказывает на общую производительность запроса.
PS: не имея много практический опыт работы с MySQL я задавался вопросом, если l.esMiles <> '0'
не «медленнее», чем l.esMiles <> 0
, в предположении, что l.esMiles является числовое поле (например, целым числом или десятичной и т.д ..)
Что такое <> для? –
$ cond - переменная, содержащая условия, которые я установил перед запуском запроса –
@RaTre. , , '<>' - обычный оператор, используемый для неравных в SQL. Условия в 'WHERE' могут повлиять на оптимизацию. –