[英]Optimize this slow mysql query
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
我知道這可以改善...
我想知道在可行的情況下COUNT
是否會更快。
主要的改進將是獲取列作為記錄:
cotacoes 123
n_publicar 456
...
SELECT 'cotacoes', SUM(...)
...
UNION SELECT 'n_publicar', SUM(...)
...
原因是條件部分排除,然后可以更好地利用連接。
另外,您也可以分別處理最慢的SELECT。 您可以執行並行查詢,將其拆分為子查詢。
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
並提供一些有關表的大小的提示。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.