2012-04-23 8 views
0

現在、UPDATE pages SET hits = hits+1 WHERE id=:idを使用してPDOでページヒットをインクリメントしていますが、スクリプトのプロファイリング中に平均で30ms & 65msを更新します。例えば、ダンプここ されています: mySQL - ページビューをより速くインクリメントする方法は?

hitsは、テーブル内のインデックスで、インクリメントするより高速な方法があります

[queries] => Array 
(
[0] => Array 
    (
    [sql] => SELECT * FROM `settings` 
    [time] => 0.22602081298828 
    ) 

[1] => Array 
    (
    [sql] => SELECT * FROM `menu_links` WHERE `active`="1" ORDER BY position ASC 
    [time] => 0.2291202545166 
    ) 

[2] => Array 
    (
    [sql] => SELECT * FROM `pages` WHERE `url`=:field AND active='1' 
    [time] => 0.27203559875488 
    ) 

[3] => Array 
    (
    [sql] => SELECT * FROM `pages` WHERE `menu_link`=:field AND active='1' 
    [time] => 0.24008750915527 
    ) 

[4] => Array 
    (
    [sql] => UPDATE pages SET hits = hits+1 WHERE id=:id 
    [time] => 31.989107131958 
) 
) 

UPDATE

それは思わLIMIT 1句を使用して10〜15msでスピードアップしました。

[4] => Array 
    (
    [sql] => UPDATE `pages` SET hits = hits+1 WHERE id=1 LIMIT 1 
    [time] => Between 15 & 25ms 
) 

LOW_PRIORITY

[4] => Array 
    (
    [sql] => UPDATE LOW_PRIORITY `pages` SET hits = hits+1 WHERE id=1 LIMIT 1 
    [time] => Between 17 & 30ms 
) 
+0

ページテーブルにはどのくらいの行がありますか。 IDはインデックスに登録されていますか?一般に、更新は読み取りに比べて数桁遅いです。 –

+0

現在、1つの行しかありません。インデックス番号が –

+0

です。これ以上のことはできません。 http://dev.mysql.com/doc/refman/5.0/ja/update-speed.html –

答えて

1

これを行う最良の方法です。

もちろん、更新には選択よりも時間がかかります。これは、ストレージの変更を意味するためです。通常、選択にはさまざまなキャッシュやバッファが使用されます。

速度が非常に重要な場合は、キューソフトウェアをセットアップし、増分タスクをキューに追加し、バックグラウンドワーカーによって一括してデータを更新することができます。このソリューションははるかに効率的ですが、変更をすぐに利用できるようにする必要がない場合にのみ適用されます。

+0

これを絞る方法はありませんか? –

+0

@Lawrence Cherone:アップデートが追加されました。しかし、それは別の層を紹介します(それは必ずしも価値がありません) – zerkms

+0

"キューソフトウェア"のいくつかの例を教えてください。 – Farhad

1

一般に、更新は読み取りよりもはるかに低速です。 idが索引付けされ、作業しているデータ・セットが大きいとすれば、それ以上のことはできません。次のページでは、パフォーマンスを向上させる方法や、LIMIT句を追加する方法について説明します。

速いアップデートを取得する別の方法は、更新を遅らせて、後で行の多くの の更新を行うことです。複数の更新プログラムを同時に実行すると、テーブルをロックすると一度に1つずつ実行するよりも、多くの時間が短縮されます( )。

http://dev.mysql.com/doc/refman/5.0/en/update-speed.html

2

インデックスがあまりにも変更する必要があるため、実際に、を更新するために、列遅くなります列に索引。

純粋なMySQLを使用すると、サーバーの設定を微調整する以外に、できることはあまりありません。一時的なメモリに多くの操作を保持し、ディスクへの書き込み回数を少なくします。しかし、サーバーは操作を1つのログファイルに記録する必要があります。 ACIDは安くはない。

したがって、ほとんどのサーバーはmemcachedなどの別の種類の一時記憶域を使用します。この方法では、値はRAMに格納され、値が特定のしきい値に達した場合にのみ、データベースに書き込まれます。

0

あなただけのページのロード時間を短縮し、サーバーはPHP-FPM/FastCGIので設定された後であれば基本的にはこれがフラッシュします(fastcgi_finish_request呼び出すことができます)、その後、あなたはヒットカウンタを更新し、http://php-fpm.org/wiki/Features#fastcgi_finish_request.28.29

を見ますクライアントに出力して接続を閉じ、PHPスクリプトの実行を継続するので、クライアントはカウンタの更新操作を待つ必要がありません。これはサーバーの負荷を軽減するものではなく、クライアントのアクセス時間だけです。

+0

これは、デッドリンクやDNSの問題を抱えている、thx tho –

+0

wierd、それをクリックするとページが正常に開きます... –

+0

http://turbolinux.org/2011/05/php-fpm- fastcgi_finish_request-feature / –

関連する問題