1

目前我使用UPDATE pages SET hits = hits+1 WHERE id=:idPDO 来增加页面点击量,但在分析脚本时,它平均需要 30 毫秒到 65 毫秒来更新。

是否有更快的增量方法,hits也是表中的一个索引:这是一个示例转储:

[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-15 毫秒

[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

4 回答 4

2

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

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

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

于 2012-04-23T22:47:16.633 回答
1

这是最好的方法。

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

如果速度对您非常重要 - 您可以设置任何队列软件并将递增任务添加到队列并由一些后台工作人员以批量方式刷新数据。此解决方案会更有效,但仅适用于您不需要立即提供更改的情况。

于 2012-04-23T22:36:35.420 回答
1

一般来说,更新比读取慢得多。鉴于它id已编入索引并且您正在使用的数据集很大,因此您无能为力。以下页面描述了可以提高性能或添加 LIMIT 子句的方法。

获得快速更新的另一种方法是延迟更新,然后在以后连续进行多次更新。如果锁定表,一起执行多个更新比一次执行一个要快得多。

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

于 2012-04-23T22:40:58.943 回答
0

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

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

于 2012-04-23T23:08:42.370 回答