大量の行を持つ MySql テーブルがあります。私は単純なリクエストを行っていますが、かなり高速に動作します。クライアントにデータをフェッチする唯一の問題は、リクエスト自体がわずか 0.3 秒しかかからないのに、約 150 秒間非常に遅いことです。
クライアントと Amazon EC2 MySql インスタンスで php 5.3 + ZendFramework を使用しています。PHP コードと MySql は別のサーバーにあります。
データの取得速度を上げる方法を誰か教えてもらえますか?
大量の行を持つ MySql テーブルがあります。私は単純なリクエストを行っていますが、かなり高速に動作します。クライアントにデータをフェッチする唯一の問題は、リクエスト自体がわずか 0.3 秒しかかからないのに、約 150 秒間非常に遅いことです。
クライアントと Amazon EC2 MySql インスタンスで php 5.3 + ZendFramework を使用しています。PHP コードと MySql は別のサーバーにあります。
データの取得速度を上げる方法を誰か教えてもらえますか?
コメントに基づいて、実行中のクエリを最終的に提供しました。
select * from table
また、「大量の行」があるとも言いました。これは、データベースにクエリを実行しているボックスに転送するのに時間がかかる理由を理解するのに十分簡単なはずです。
また、クエリが高速に実行されるという理由だけで、ネットワークの制限に対処する必要があります。さらに、仮に、たとえば ORM を使用している場合、実際に結果を受け取ると、結果セットのハイドレーションによってリクエストが複雑になり、時間がかかることがわかります。
全体として、あなたはこの質問に自分で答えました。select * from table
テーブルが「巨大」な場所では実行しないでください。
クエリに制限とオフセットを追加することを検討し、実際に必要な行のみを選択する必要があります。
また、「巨大」は極めて主観的なものです。私にとって、大きなテーブルは約 1000 万行です。しかし、他の人にとって1000万はかなり小さいです。巨大なテーブルが何であるかについては、数字を付けたくありません。
すべてのコメントが言っているように、正確な(または少なくともあいまいでない)回答を得るには、さらに情報を提供する必要があります。ただし、作成するクエリごとに覚えておくべき経験則がいくつかあります。
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'
%
は唯一のワイルドカードではありません: は単一の文字に対する_
一種のジョーカーですEXPLAIN
、EXPLAIN
そしてEXPLAIN
また...LIMIT
- 「巨大な」データセットの結果を取得することは必須です。膨大な量のデータを取得している場合、それらをどうしていますか? すべてのデータが 1 つの大きな塊としてクライアントに送信される状況は考えられませんね。速度が遅いのは、テーブルからすべてのデータを取得するためであり、データベースと Web サイト用に 2 つの異なるサーバーがあるため、すべてのデータをネットワーク経由で転送する必要があるため、さらに速度が低下します。
クライアントで実行すると高速になる理由を尋ねると、ほとんどの SQL クライアントが自動的に行数に制限を追加するためです。