简体   繁体   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

I know that this can be improved... 我知道这可以改善...

I wonder whether COUNT would be faster where feasible. 我想知道在可行的情况下COUNT是否会更快。

The main improvement would be to fetch the columns as records: 主要的改进将是获取列作为记录:

cotacoes    123
n_publicar   456
...

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

The reason being that the conditions are partially exclusing and joins could then be better exploited. 原因是条件部分排除,然后可以更好地利用连接。

Also you might then tackle the slowest SELECT separately. 另外,您也可以分别处理最慢的SELECT。 And you could do parallel queries, splitting in subqueries. 您可以执行并行查询,将其拆分为子查询。

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

leilao_avaliacao needs INDEX(id_pregao, situacao) in either order. 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 needs INDEX(id_comprador, id_edital) in either order leilao_edital需要INDEX(id_comprador, id_edital)

For further discussion, please provide SHOW CREATE TABLE and give us some hints of how big the tables are. 为了进行进一步的讨论,请提供SHOW CREATE TABLE并提供一些有关表的大小的提示。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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