2016-08-02 191 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,给我们的桌子有多大的提示。