簡體   English   中英

mySQL - 增加頁面瀏覽量的更快方法?

[英]mySQL - A faster way to increment page views?

目前我正在使用UPDATE pages SET hits = hits+1 WHERE id=:id來增加PDO的頁面命中率,但是在分析腳本時,它平均需要在30ms和65ms之間進行更新。

有沒有更快的增量方式, 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
  )
)

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
  )

列上的索引實際上會使列更新更慢 ,因為索引也需要修改。

使用純MySQL,除了調整服務器設置外,你無能為力:在臨時內存中保存更多操作,不經常寫入磁盤。 但是,服務器仍需要將操作記錄到一個日志文件中。 ACID並不便宜。

因此,大多數服務器使用另一種臨時存儲,如memcached或其他東西。 這樣,值就存儲在RAM中,並且只有當值達到某個閾值時,才會將其寫入數據庫。

這是最好的方式。

顯然更新需要的時間比select更多,因為它意味着存儲修改,而選擇通常使用各種緩存和緩沖區。

如果速度對您非常重要 - 您可以設置任何隊列軟件並將增量任務添加到隊列中,並由某個背景工作者以批量方式刷新數據。 此解決方案效率會更高,但只有在您不需要立即更改時才適用。

通常,更新比讀取慢得多。 鑒於id已編入索引並且您正在使用的數據集很大,因此您可以做的更多。 以下頁面介紹了可以提高性能或添加LIMIT子句的方法。

獲得快速更新的另一種方法是延遲更新,然后在以后連續執行許多更新。 如果鎖定表,一次執行多個更新比一次執行多個更新要快得多。

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

如果您只是在減少頁面加載時間並且您的服務器設置為php-fpm / FastCGI后,您可以調用fastcgi_finish_request(),然后更新命中計數器,請參閱http://php-fpm.org/wiki/Features #fastcgi_finish_request.28.29

基本上,這會將輸出刷新到客戶端並關閉連接,然后繼續執行PHP腳本,因此客戶端不必等待計數器更新操作。 這不會卸載服務器,只是客戶端的訪問時間......

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM