0

私のクエリは完了するのに5秒かかりますが、非常に基本的なものとしてはかなり聞こえます。説明クエリを実行しました:

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

私がそれを最適化するのを手伝うことは可能ですか?

ありがとう :)

4

1 に答える 1

1

読みにくいWHERE句の代わりにJOINを使用してクエリを再構築しました。すべてが主要な「材料」テーブルに基づいていることがわかります。したがって、私の最初の提案は、「STRAIGHT_JOIN」句を使用して、リストした順序でクエリを実行するようにMySQLに指示することです。クエリを駆動する「プライマリ」テーブル。他のすべてのテーブルは、基本的に「ルックアップ値」テーブルです。

次に...各テーブルには、具体的には次のインデックスがあります。すでに各テーブルの主キーを使用していると思いますが、GROUP_CONCATはテーブルから対応する記述フィールドを取得しているため、その列をインデックスに含めます。他の理由は次のとおりです...クエリを実行してインデックスを使用するときに、クエリが「その他」の列のrawテーブルに戻る必要がない場合は、戻る必要はありません。したがって、説明をインデックスの一部として持つことにより、結合を実行し、インデックスから両方の説明を取得できます...

私はインデックスを持っているでしょう

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 に答える