mySQL - 增加页面浏览量的更快方法?

时间:2012-04-23 22:33:40

标签: php mysql pdo

目前我正在使用UPDATE pages SET hits = hits+1 WHERE id=:id来增加使用PDO的页面点击次数,但是在对脚本进行概要分析时,它的平均值在30毫秒之间。 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
  )
)

更新

似乎使用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
  )

4 个答案:

答案 0 :(得分:2)

列上的索引实际上会使列更新更慢,因为索引也需要修改。

使用纯MySQL,除了调整服务器设置外,你无能为力:在临时内存中保留更多操作,少写入磁盘。但是,服务器仍需要将操作记录到一个日志文件中。 ACID并不便宜。

因此,大多数服务器使用其他类型的临时存储,例如memcached或其他东西。这样,值就存储在RAM中,并且只有当值达到某个阈值时,才会将其写入数据库。

答案 1 :(得分:1)

这是最好的方法。

显然更新需要的时间比select更多,因为它意味着存储修改,而选择通常使用各种缓存和缓冲区。

如果速度对您非常重要 - 您可以设置任何队列软件并将增量任务添加到队列中,并由一些背景工作者以批量方式刷新数据。此解决方案效率会更高,但只有在您不需要立即更改时才适用。

答案 2 :(得分:1)

通常,更新比读取慢得多。鉴于id已编入索引并且您正在使用的数据集很大,因此您无法做更多事情。以下页面介绍了可以提高性能的方法或添加LIMIT子句。

  

获得快速更新的另一种方法是延迟更新,然后执行许多操作   稍后更新。一起执行多个更新很多   如果您锁定桌子,则比一次做一件快。

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

答案 3 :(得分:0)

如果您只是在减少页面加载时间并且您的服务器设置为php-fpm / FastCGI后,您可以调用fastcgi_finish_request(),然后更新点击计数器,请参阅http://php-fpm.org/wiki/Features#fastcgi_finish_request.28.29

基本上,这会将输出刷新到客户端并关闭连接,然后继续执行PHP脚本,因此客户端不必等待计数器更新操作。这不会卸载服务器,只是客户端的访问时间......