「なぜこれに時間がかかりすぎるのですか?」また、「残念ながら、データを取得して表示するのに5秒以上かかりました」とも言っています。また、クエリのプロファイリング出力を報告しました。
ご覧のとおり、プロファイラーによって報告された各ステップの合計時間は0.000154秒です。したがって、プロファイラーの観点からは、クエリはそのような時間(0.000154)で完了しました。
それでは、「... 5秒以上?」という結果が得られるのはなぜですか。
あなたは、3文字のフィールドを持つ2300万のレコードテーブルをフィルタリングしていると言いました。残念ながら、クエリが返すレコードの数を教えてくれません...しかし、提供されたEXPLAIN SELECTのおかげで、クエリが336052レコードを返したようです。
また、すべてのアクティビティがGUI(PHPMyAdmin?)を介して実行されているようです。
したがって、上記のすべての後、元の質問を次のように再定式化できます。
「関連するクエリのMySQL実行時間が0.000154秒であるのに、GUI内で336.052レコードが5秒以上表示されるのはなぜですか?」
私の意見では、答えは非常に単純です。5秒は、336.052レコードがパスに沿って移動するための(実際には非常に短い)時間です。MySQLエンジン=> MySQLクライアントライブラリ=> PHP MySQLモジュール=> Apache =>ネットワーク= > PCのTCP / IPスタック=>ブラウザ=> DOMパーサー/ビルダー/など。=>レンダリングされたHTMLページ。
私の以前の経験と同様に、結果の送信に必要な時間は、「通常」、そのようなデータを取得するために必要な時間よりもはるかに長くなります。これは、PHP-MySQLやPerl-DBD-MySQLなどのライブラリが関係している場合に特に当てはまります。MySQLがすべてのレコードを適切に識別(および抽出)した後、レコードを取得するには実際に多くの時間が必要です。
この問題を解決するには?
繰り返しますが、非常に簡単です。単一のデータセット全体で336.052レコードのすべてが必要であることを本当に確信していますか?
あなたの答えが本当に「はい!私はそれらすべてが必要です」である場合、アプリケーションが単独でPAGINATIONおよび/またはUSER-Interactionを処理し、そのようなデータのすべてを収集すると、おそらく多くの時間を費やすことになります。MySQLとのさらなる対話を必要とせずにユーザーと対話する。このような場合、5秒(またはそれ以上)待機しても問題はありません。
答えが「いいえ、より「人間的な」データセットサイズに対処したい」場合は、クエリを調整して(少なくとも)より「人間的な」データセット(数十、または最大で数百のレコード)。そのような場合、あなたはより短い時間であなたの結果を得るでしょう。
ところで、これは、ServerFault でこの別の投稿で発生した問題とまったく同じです。132Mのレコードが..- not-mysql-strictly-related magic pathに沿って移動できるようにするための88秒:-)