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

...私は可能な場合<code>COUNT</code>がより速くなるかどうかを疑問に思う私はこれを向上させることができることを知っているこの遅いmysqlのクエリ

+3

あなたと他の人がそれを理解できるように、フォーマットすることから始めます。 –

+2

これは非常に未解決の問題です。なぜなら、あなたは1つの声明でそれほど多くのことをしており、必要な情報をすべて持っているわけではないからです。データタイプ、エントリ数などが含まれていますが、どちらの方法でも問題が解決できるのはいくつかの再フォーマットです。 – LordWilmore

+0

クエリ時間を改善するには、おそらく**インデックス**を追加する必要があります。私はクエリ自体を改善することはできません(または、最悪の場合にはmysqlがそれを行うべきです)が、私が知る限り、何か大きなことはしていません。結合条件とwhere句で使用する属性のインデックス。 – Jakumi

答えて

0

を最適化します。

主な改良点はレコードとして列を取得するために、次のようになります。

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_avaliacaoINDEX(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を提供し、私たちのテーブルがどのように大きないくつかのヒントを与えてください。

関連する問題