1

現在UPDATE pages SET hits = hits+1 WHERE id=:id、PDO でページ ヒットをインクリメントするために使用していますが、スクリプトのプロファイリング中に、更新に平均 30 ミリ秒から 65 ミリ秒かかります。

インクリメントするより速い方法はありますかhits、テーブル内の INDEX もあります: ダンプの例を次に示します。

[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
  )
)

アップデート

LIMIT 1 句を使用すると、10 ~ 15 ミリ秒高速化されたようです

[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
  )
4

4 に答える 4

2

列にインデックスがあると、実際には列の更新が遅くなります。これは、インデックスも変更する必要があるためです。

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

したがって、ほとんどのサーバーは、memcached などの別の種類の一時ストレージを使用します。このように、値は RAM に保存され、値が特定のしきい値に達した場合にのみ、データベースに書き込まれます。

于 2012-04-23T22:47:16.633 に答える
1

一般に、更新は読み取りよりもはるかに低速です。インデックスidが作成されており、使用しているデータ セットが大きい場合、これ以上できることはありません。次のページでは、パフォーマンスを改善する方法、または LIMIT 句を追加する方法について説明します。

更新を高速化するもう 1 つの方法は、更新を遅らせてから、後で連続して多くの更新を行うことです。テーブルをロックすると、複数の更新をまとめて実行する方が、一度に 1 つずつ実行するよりもはるかに高速になります。

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

于 2012-04-23T22:40:58.943 に答える
1

それを行うための最良の方法です。

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

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

于 2012-04-23T22:36:35.420 に答える
0

ページの読み込み時間を短縮した後で、サーバーが php-fpm/FastCGI でセットアップされている場合は、fastcgi_finish_request() を呼び出すことができます。その後、ヒット カウンターを更新します。http://php-fpm.org/wiki/Features を参照してください。 #fastcgi_finish_request.28.29

基本的に、これによりクライアントへの出力がフラッシュされ、接続が閉じられ、その後 PHP スクリプトの実行が続行されるため、クライアントはカウンターの更新操作を待つ必要がありません。ただし、これはサーバーの負荷を軽減しません。クライアントのアクセス時間だけです...

于 2012-04-23T23:08:42.370 に答える