私のクエリは完了するのに5秒かかりますが、非常に基本的なものとしてはかなり聞こえます。説明クエリを実行しました:
私がそれを最適化するのを手伝うことは可能ですか?
ありがとう :)
私のクエリは完了するのに5秒かかりますが、非常に基本的なものとしてはかなり聞こえます。説明クエリを実行しました:
私がそれを最適化するのを手伝うことは可能ですか?
ありがとう :)
読みにくい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 ;