2016-08-02 12 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 

Ich weiß, dass diese verbessert werden kann ...optimieren diese langsame mysql query

+3

Beginnen Sie mit der Formatierung, damit Sie und andere Menschen es verstehen können. –

+2

Das wird eine ziemlich offene Frage sein, weil Sie so viel in einer Aussage machen, und wir haben nicht alle erforderlichen Informationen, z.B. Datentypen, Anzahl der Einträge usw. Aber so oder so könnten Sie mit einer gewissen Umformatierung umgehen. – LordWilmore

+0

Zur Verbesserung der Abfragezeit sollten Sie ** Indizes ** hinzufügen, die für diese Abfrage nützlich sind. Ich glaube, dass die Abfrage selbst nicht verbessert werden kann (oder mysql sollte das im schlimmsten Fall für Sie tun), aber Sie tun nichts Verrücktes, soweit ich das beurteilen kann. Indizes für die Attribute, die Sie in den Join-Bedingungen und in der Where-Klausel verwenden. – Jakumi

Antwort

0

Ich frage mich, ob COUNT schneller sein würde, wo dies möglich ist.

Die wichtigste Verbesserung wäre es, die Spalten als Datensätze zu holen:

cotacoes 123 
n_publicar 456 
... 

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

Der Grund dafür ist, dass die Bedingungen teilweise sind exclusing und dann besser ausgenutzt werden könnten Joins.

Auch Sie könnten dann die langsamste SELECT separat angehen. Und Sie könnten parallele Abfragen durchführen und Unterabfragen aufteilen.

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

leilao_avaliacao benötigt INDEX(id_pregao, situacao) in beliebiger Reihenfolge.

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

leilao_edital benötigt INDEX(id_comprador, id_edital) in beliebiger Reihenfolge

Für die weitere Diskussion, bitte SHOW CREATE TABLE bieten und geben Sie uns ein paar Hinweise, wie groß die Tische sind.