mysql - 优化这个慢mysql查询

标签 mysql left-join query-optimization inner-join

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。您可以执行并行查询,拆分子查询。

关于mysql - 优化这个慢mysql查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38720313/

相关文章:

具有查询优化功能的 php 函数

mysql - 使用联接时 GROUP BY 未正确排序

c# - LINQ,左连接,仅获取连接表中的空位置

mysql - 使用 JOIN 优化 MySQL 计数查询

php - 如何构建更复杂的mysql查询进行优化

php - 将文本列转换为时间

Mysql 事件不工作

php - 日期子问题

mysql - 带有左连接和并集的 SELECT

mysql - 使用一个大 View 比使用两个较小 View 更好(在内存和处理方面)