2009-07-27 1 views
6

SQLクエリを高速化するための簡単な方法が必要です。私はハードウェアの違いを心配する必要はない、私は基本的に相対的な番号が必要です。どのように矛盾の少ないMySQLのクエリ速度をテストするには?

これは私が(そのファジーが、作品)PHPでやってきたものです:

// CONNECT TO DB HERE 

$sub = new YomoSubscription(95,783); 

$t = microtime(TRUE); 

// contains the SQL db call i'm testing 
$fp = $sub->generateFingerprint(); 

echo microtime(TRUE)-$t; 

私が午前PROBLEMは時々最初の接続時に/実行私のテストは、1.25秒を要し、ということです例えば。しかしその後の接続では0.004秒かかる... これはなぜ

私はMySQLのクエリキャッシュがmy.iniファイルでオフになっているかなり確信している:あなたがかもしれないhttp://dev.mysql.com/doc/refman/5.0/en/information-functions.html#function_benchmark

答えて

4

あなたの最初のクエリは、MySQLが実際に最初のクエリでディスクに当たっているため遅いかもしれません。

ご使用のオペレーティングシステムによって、ファイルが読み込まれるとメモリにキャッシュされることがあります。その結果、後続の読み込みは実際にディスクにヒットする必要はなく、ずっと速く戻ります。

一般的に私は数回クエリを実行し、一貫性を探します。多くの場合、最初の実行には数倍の時間がかかりますが、2番目の3番目と4番目の時間にはほぼ同じ時間がかかります。これらの後続の実行は、おそらく実際の運用システムで見られるパフォーマンスの種類をよりよく表します。つまり、運用システムのデータベースにアクセスすることはほとんどありません。

最終的には、パフォーマンスの問合せには、ほとんどの場合、開発に迅速なパスを渡して、プロダクションでの低速な問合せログを監視して、のどのが正常に動作する必要があるかを確認する必要があります。

パフォーマンスデータのクエリをプログラムで実行する限り、いくつかのサンプルを取り、中央値を使用します。しかし、実際には、これは実稼働環境で実行される実際のパフォーマンスの問題を非常に代表するものではありません。

8

は、SELECT BENCHMARK(回、クエリ)

詳しい情報を使用してみてくださいあなたのクラスで永続的な接続を使用する。 pconnectは接続を再利用し、このタイプの遅延を考慮に入れます。

0

query_cache_size=0 
2

のはそれを想定してみましょう:

  1. あなたは永続的な接続を使用していない
  2. 統計が行われ、サーバ(ネットワーク接続)データベースを使用している
  3. 誰も他の
  4. (行にインストールされているデータベース/テーブルロック)
  5. 他の重いプロセスが実行されていません
  6. など....

あなたが本当にベンチマーククエリにしたい場合は、次の操作を実行する必要があります。

$database->query('SET SESSION query_cache_type = OFF'); 

次にあなたがループに2,3回(サーバーを「ウォームアップ」への)クエリを実行します。

だけにして:

$database->query('FLUSH STATUS'); #If you use the stats to profile your query 

$t = microtime(TRUE); 
$fp = $sub->generateFingerprint(); 
echo microtime(TRUE)-$t; 

$database->query('SHOW STATUS'); 

のEt出来上がり! :)))

ところで、クエリ速度は読み込むパラメータの1つです。 SHOW STATUSEXPLAIN ...によって返された非常に貴重な情報を読む方法を学びます。これはもっと良いでしょう。ここで

はあなたが愛するのリンクです: http://www.xaprb.com/blog/2006/10/12/how-to-profile-a-query-in-mysql/

をお楽しみください。 :)

関連する問題