2011-08-10 36 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分钟的滞后时间。

缓存昂贵查询的另一半是,您需要向缓存数据添加一个标志以指明更新时间。这会阻止多个线程确定它已过期,并且所有这些线程都会获取更新。你只需要一个线程来做到这一点!