MySQL - 优化选择查询

时间:2013-02-05 23:58:41

标签: mysql optimization

我的查询需要5秒才能完成,但对于那些基本的东西来说听起来很多。我做了解释查询:

https://www.dropbox.com/s/18pedm9n5fssz4e/localhost%20_%20localhost%20_%20logrede%20_%20phpMyAdmin%203.4.11.pdf

您可以帮我优化吗?

谢谢:)

1 个答案:

答案 0 :(得分:1)

我使用JOIN重构了查询,而不是使用不太可读的WHERE子句。我看到一切都基于主要的“材料”表。所以,我的第一个建议是使用“STRAIGHT_JOIN”子句告诉MySQL按照你列出的顺序进行查询....否则,有时它会尝试为你思考并做一些可能是替代的事情“主要“表驱动查询。所有其他表基本上都是“查找值”表。

其次......在每个表上,我将特别在表上有以下索引。我确定你已经拥有了每个表的主键......但是由于你的GROUP_CONCAT从表中获得了相应的描述性字段,我会在索引中包含该列。这是另一个原因......当运行查询并使用索引时,如果查询不必返回“其他”列的原始表,则不必。因此,通过将描述作为索引的一部分,它可以进行连接并从索引中获取描述...

我会在

上有一个索引
material ( cdomaterial )
cliente ( idcliente, nome )
classeobra ( idclasse, sigla )
dma ( iddma, nome )
desenho( iddesenho, nome )
fornecedor ( idfornecedor, nome )
modelo ( idmodelo, nome )
fabricante ( idfabri, nome )
fornecido( codmaterial, preco )
unidade( idunidade, sigla )
tipofornecimento( idtipoforn, sigla )

所以,上面说过,我会运行以下查询...

SELECT STRAIGHT_JOIN
      material.codmaterial, 
      cliente.nome as cliente, 
      tipofornecimento.sigla as fornecimento, 
      unidade.sigla as unidade,
      GROUP_CONCAT(DISTINCT classeobra.sigla ORDER BY classeobra.idclasse SEPARATOR ', ') as classeobra, 
      GROUP_CONCAT(DISTINCT dma.nome ORDER BY dma.iddma SEPARATOR ', ') as dma, 
      GROUP_CONCAT(DISTINCT desenho.nome ORDER BY desenho.iddesenho SEPARATOR ', ') as desenho,
      GROUP_CONCAT(DISTINCT fornecedor.nome ORDER BY fornecedor.idfornecedor SEPARATOR ', ') as fornecedor, 
      GROUP_CONCAT(DISTINCT modelo.nome ORDER BY modelo.idmodelo SEPARATOR ', ') as modelo,
      GROUP_CONCAT(DISTINCT fabricante.nome ORDER BY fabricante.idfabri SEPARATOR ', ') as marca, 
      GROUP_CONCAT(DISTINCT fornecido.preco ORDER BY fornecido.preco SEPARATOR ', ') as preco 
   FROM 
      material
         JOIN unidad
            ON material.idunidade = unidade.idunidade 
         JOIN requisitado
            ON material.codmaterial = requisitado.codmaterial 
            JOIN cliente
               ON requisitado.idcliente = cliente.idcliente 
            JOIN tipofornecimento
               ON requisitado.idtipoforn = tipofornecimento.idtipoforn 
         JOIN possuimodelo
            ON material.codmaterial = possuimodelo.codmaterial 
            JOIN modelo
               ON possuimodelo.idmodelo = modelo.idmodelo 
               JOIN pertence,
                  ON modelo.idmodelo = pertence.idmodelo 
                  JOIN fabricante 
                     ON pertence.idfabri = fabricante.idfabri 
         JOIN utilizadoclasseobra
            ON material.codmaterial = utilizadoclasseobra.codmaterial 
            JOIN classeobra 
               ON utilizadoclasseobra.idclasse = classeobra.idclasse 
         JOIN possuidma
            ON material.codmaterial = possuidma.codmaterial 
            JOIN dma
               ON possuidma.iddma = dma.iddma 
         JOIN fornecido
            ON material.codmaterial = fornecido.codmaterial
            JOIN fornecedor
               ON fornecido.idfornecedor = fornecedor.idfornecedor 
         JOIN possuidesenho
            ON material.codmaterial = possuidesenho.codmaterial 
            JOIN desenho
               ON possuidesenho.iddesenho = desenho.iddesenho 
   GROUP BY
      material.codmaterial, 
      cliente.nome 
   ORDER BY 
      material.codmaterial ASC, 
      cliente.nome ASC ;