2011-08-10 89 views
1

有時候,我們編寫了一個內部網站,爲所有註冊到我們網站的用戶提供持續更新。該網站提供了最近5分鐘內註冊用戶的信息,需要持續SQL(select * from users...)獲取所有用戶where (Current time - Registered time) <= 300 seconds。加班時,不斷的SQL查詢已成爲瓶頸(並非我們不知道這不會發生,但我們需要內部網站,因爲目標受衆非常小,這是一個快速解決方案)。改善網站性能的建議 - PHP/MySQL

任何人都可以提供關於如何消除定期SQL提取與其他一些可以提高網站性能的解決方案的建議嗎?

+0

使用某種形式的緩存。我會使用[redis](http://www.redis.io)。這有一個php模塊phpredis。將最後一個用戶添加到緩存中,這會消耗一些負載。 –

+0

請顯示您正在運行的確切查詢。 – sanmai

回答

3

緩存是通常在此考慮的選項。許多已經去過membase(memcached的擴展),一個內存中的鍵值緩存,能夠堅持到磁盤和擴展真的很好。您可以在Couchbase's website找到一個PHP客戶端庫,並且您會發現緩存事物將1s +查詢轉換爲亞毫秒查詢。該API非常簡單:

$mc = new Memcached; 
    $mc->addServer("localhost", 11211); 
    $mc->set("a", 1); // set a 1 to the key 'a' 
    $mc->get("a"); // retrieve value at key 'a' 
3

也許你可以在這裏使用緩存。在註冊時緩存每個新用戶;這樣他們在記憶中。

在某個數字排隊或達到固定時間段後,將所有註冊和插入數據庫的人都緩存起來。

2

要解決這個特定的問題,緩存結果可能是最好的解決方案。它只需要緩存幾秒鐘 - 大多數人不會注意到數據是否落後10秒。根據應用的不同,您可能會有10分鐘的滯後時間。

緩存昂貴查詢的另一半是,您需要向緩存數據添加一個標誌以指明更新時間。這會阻止多個線程確定它已過期,並且所有這些線程都會獲取更新。你只需要一個線程來做到這一點!