0

我的查询需要 5 秒才能完成,但对于如此基本的事情来说,这听起来很重要。我做了一个解释查询:

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

可以帮我优化一下吗?

谢谢 :)

4

1 回答 1

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 ;
于 2013-02-06T01:22:15.503 回答