2016-08-02 3 views
0
SELECT SUM(a.situacao =2 OR a.situacao =0) AS cotacoes, 
     SUM(a.situacao =1) AS n_publicar, 
     SUM(a.inicio <= NOW() AND DATE_ADD(a.inicio, INTERVAL a.duracao HOUR) >= NOW() AND a.situacao =2) AS disputa, 
     SUM(a.inicio > NOW() AND a.situacao =2) AS agendados, 
     SUM(DATE_ADD(a.inicio, INTERVAL a.duracao HOUR) <= NOW() AND a.situacao =2 AND a.id_vencedor = -2) AS analise, 
     SUM(a.prazoi > NOW() AND a.situacao =2 AND a.id_vencedor >0) AS aguardando_execucao, 
     SUM(a.situacao =0) AS cancelados, 
     SUM(DATE_ADD(a.inicio, INTERVAL a.duracao HOUR) <= NOW() AND a.situacao =2 AND a.id_vencedor = -3) AS fracassados, 
     SUM(a.prazot < NOW() AND a.situacao =2 AND a.id_vencedor >0 AND (b.id_avaliacao IS NULL OR b.id_avaliacao = '')) AS avaliacao, 
     SUM(a.situacao =2 AND a.id_vencedor >0 AND a.prazot > NOW() AND a.prazoi <= NOW()) AS execucao 
FROM leilao_pregoes a 
LEFT JOIN leilao_avaliacao b ON a.id_pregao = b.id_pregao AND b.situacao = 1 
INNER JOIN leilao_edital c ON a.id_edital = c.id_edital 
WHERE c.id_comprador =1 

Я знаю, что это может быть улучшено ...Оптимизировать этот медленный MySQL запрос

+3

Начните с форматирования, чтобы и вы, и другие люди могли это понять. –

+2

Это будет довольно открытый вопрос, потому что вы делаете так много в одном утверждении, и у нас нет всей необходимой информации, например. типы данных, количество записей и т. д. Но в любом случае вы можете решить проблему с повторным форматированием. – LordWilmore

+0

, чтобы улучшить время запроса, вы, вероятно, должны добавить ** индексы **, где это полезно для этого запроса. Я считаю, что сам запрос не может быть улучшен (или mysql должен сделать это для вас в худшем случае), но, насколько я могу судить, вы не делаете ничего сумасшедшего. индексы по тем атрибутам, которые вы используете в условиях соединения и в предложении where. – Jakumi

ответ

0

Интересно, будет ли COUNT быть быстрее там, где это возможно.

Основное улучшение было бы извлечь столбцы в виде записей:

cotacoes 123 
n_publicar 456 
... 

SELECT 'cotacoes', SUM(...) 
... 
UNION SELECT 'n_publicar', SUM(...) 
... 

Причина в том, что условия частично exclusing и присоединяется тогда можно было бы более эффективно использовать.

Также вы могли бы заняться самым медленным SELECT отдельно. И вы можете выполнять параллельные запросы, разделяя их в подзапросах.

0
LEFT JOIN leilao_avaliacao b ON a.id_pregao = b.id_pregao AND b.situacao = 1 

leilao_avaliacao нуждается INDEX(id_pregao, situacao) в любом порядке.

INNER JOIN leilao_edital c ON a.id_edital = c.id_edital 
WHERE c.id_comprador =1 

leilao_edital нуждается INDEX(id_comprador, id_edital) в любом порядке

Для дальнейшего обсуждения, просьба представить SHOW CREATE TABLE и дать нам некоторые подсказки о том, как велики таблицы.