繁体   English   中英

优化此慢速mysql查询

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM