1

完了までに4分かかる挿入選択クエリを実行したため、最適化とインデックスについて何かを学ぼうとしています。ここで、複数のインデックスを追加しましたが、クエリが0.160秒で実行されたようです。今私が疑問に思っているのは、注文テーブルでorderdateで注文しているときに、顧客テーブルがusingfilesortメッセージを受け取る理由です。クエリと説明:

ここに画像の説明を入力してください

O(Orders)で(orderdate、orderid)と(orderdate、orderid、customerid)のインデックスを試しました。そのうちの1つが役立つと思いましたが、サイコロはありません。誰かが私に理由を理解するのを手伝ってもらえますか?

4

1 に答える 1

1

「filesort」を使用するクエリを使用しても問題はありません。つまり、インデックスに基づいて結果を並べ替えることができないということです。

インデックスで並べ替えを実行できない理由は、この場合ORDER BY、結合キューの最初のテーブル以外のテーブルの列が含まれているためです。

クエリ結果にはあまり多くの行が含まれていないため、使用されている一時テーブルはおそらくメモリ内にあります。

クエリ結果がそのクエリからフェッチされると、結果が一時テーブルに入れられ、後で並べ替えることができます。

最初のインデックスを追加すると、クエリが高速化された可能性があります。これは、MySQL が最初に結果を取得するために完全なテーブル スキャンを実行していたためで、これには非常に時間がかかりました。適切なインデックスを追加すると、レコードの検索は非常に迅速になります。もともと一時テーブルでファイルソートを実行する必要があったのかもしれませんが、これはおそらく現在よりも遅くも速くもありませんでした。

Orders テーブルの結合を移動して Products テーブルの結合の前に配置すると、一時テーブルとファイルの並べ替えを使用しなくても済む場合があります。

ファイルソートを使用するとはどういう意味ですか? 詳細については、MySQL が内部一時テーブルを使用する方法を参照してください。

于 2012-09-13T21:06:46.090 に答える