2012-04-23 15 views
0

目前即時通訊使用UPDATE pages SET hits = hits+1 WHERE id=:id遞增頁面PDO命中,但在剖析劇本平均其採取30ms的&爲65μs之間進行更新。mySQL - 增加頁面瀏覽量的更快方法?

是否有增加一個更快的方法,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 
) 

with LOW_PRIORITY

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

頁表有多少行。 id索引?一般來說,與讀取相比,更新速度要慢幾個數量級。 – 2012-04-23 22:37:22

+0

目前只有一行,是它的索引 – 2012-04-23 22:38:10

+0

我不確定你可以做更多。 http://dev.mysql.com/doc/refman/5.0/en/update-speed.html – 2012-04-23 22:39:51

回答

1

正是這樣做的最佳方式。

很顯然更新花費的時間比選擇更多的時間,因爲它意味着存儲的修改,而選擇通常使用不同的高速緩存和緩衝區。

如果速度對你來說很重要 - 你可以設置任何隊列軟件和附加增加任務隊列中,並通過一些backgound工人刷新批量方式的數據。此解決方案效率更高,但只有在您不需要立即提供更改時才適用。

+0

所以沒有辦法壓縮它? – 2012-04-23 22:37:32

+0

@勞倫斯Cherone:有,增加了一個更新。但是它引入了另一個層次(這並不總是值得的) – zerkms 2012-04-23 22:38:54

+0

你能告訴我一些「隊列軟件」的例子嗎? – Farhad 2016-05-24 20:18:59

1

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

獲得快速更新的另一種方式是延遲更新,然後在更晚的時間內執行多個更新。如果鎖定表格,一次執行多個更新比一次執行多個更快。

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

2

在列的索引實際上會使列較慢的更新,因爲索引需要被修改過。

使用純MySQL的,沒有什麼可以做,除了調整服務器設置:持有臨時存儲更多的操作,較少寫入磁盤。但是,服務器仍然需要將操作記錄到一個日誌文件中。 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 – 2012-04-23 23:28:19

+0

奇怪,當我點擊它的網頁打開就好... – 2012-04-23 23:31:18

+0

http://turbolinux.org/2011/05/php-fpm- fastcgi_finish_request特徵/ – 2012-04-23 23:32:22

相關問題