3

大量の行を持つ MySql テーブルがあります。私は単純なリクエストを行っていますが、かなり高速に動作します。クライアントにデータをフェッチする唯一の問題は、リクエスト自体がわずか 0.3 秒しかかからないのに、約 150 秒間非常に遅いことです。

クライアントと Amazon EC2 MySql インスタンスで php 5.3 + ZendFramework を使用しています。PHP コードと MySql は別のサーバーにあります。

データの取得速度を上げる方法を誰か教えてもらえますか?

4

3 に答える 3

2

コメントに基づいて、実行中のクエリを最終的に提供しました。

select * from table

また、「大量の行」があるとも言いました。これは、データベースにクエリを実行しているボックスに転送するのに時間がかかる理由を理解するのに十分簡単なはずです。

また、クエリが高速に実行されるという理由だけで、ネットワークの制限に対処する必要があります。さらに、仮に、たとえば ORM を使用している場合、実際に結果を受け取ると、結果セットのハイドレーションによってリクエストが複雑になり、時間がかかることがわかります。

全体として、あなたはこの質問に自分で答えました。select * from tableテーブルが「巨大」な場所では実行しないでください。

クエリに制限とオフセットを追加することを検討し、実際に必要な行のみを選択する必要があります。

また、「巨大」は極めて主観的なものです。私にとって、大きなテーブルは約 1000 万行です。しかし、他の人にとって1000万はかなり小さいです。巨大なテーブルが何であるかについては、数字を付けたくありません。

于 2012-10-22T09:22:58.847 に答える
0

すべてのコメントが言っているように、正確な(または少なくともあいまいでない)回答を得るには、さらに情報を提供する必要があります。ただし、作成するクエリごとに覚えておくべき経験則がいくつかあります。

  • SELECT *特に のようなものはできるだけ避けSELECT COUNT(*)て、関心のあるフィールドのみを選択してください。
  • 巧妙にインデックス付けされたテーブルにデータを分割し、 を使用しますJOIN。良いものJOINはパフォーマンスを大幅に向上させることができます。
  • を使用EXPLAIN EXTENDEDし、MySQL がディスク上に一時テーブルを作成しなければならない状況を回避します
  • を使用する場合EXPLAINは、暗黙CASTの やCOLLATION変換も確認してください。PHP とは異なり、UNSIGNED INTEGERは と同じではありませんVARCHAR。false になる文字列 !== int... が$x = 123;続くと考えてください。if ($x === '123')
  • 常にディスク アクセスが発生するため、大きなデータ フィールド ( などMEDIUMTEXT) は避けてください。
  • 特にワイルドカード ( )LIKEを使用している場合は、できる限り避けてください。x LIKE 'y%z'
  • 覚えておいてください:%は唯一のワイルドカードではありません: は単一の文字に対する_一種のジョーカーです
  • あなたはインデックスを持っていますが、愚かにならないように、より多くのインデックスを使用できますか? 少なすぎず、多すぎず
  • 適切なストレージ エンジンを選択しましたか?
  • EXPLAINEXPLAINそしてEXPLAINまた...
  • 遅いクエリを使用する必要ある場合は、結果をキャッシュします
  • LIMIT- 「巨大な」データセットの結果を取得することは必須です。膨大な量のデータを取得している場合、それらをどうしていますか? すべてのデータが 1 つの大きな塊としてクライアントに送信される状況は考えられませんね。
于 2012-10-22T09:30:12.033 に答える
0

速度が遅いのは、テーブルからすべてのデータを取得するためであり、データベースと Web サイト用に 2 つの異なるサーバーがあるため、すべてのデータをネットワーク経由で転送する必要があるため、さらに速度が低下します。

クライアントで実行すると高速になる理由を尋ねると、ほとんどの SQL クライアントが自動的に行数に制限を追加するためです。

于 2012-10-22T09:26:53.353 に答える