目前我正在使用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
)
答案 0 :(得分:2)
列上的索引实际上会使列更新更慢,因为索引也需要修改。
使用纯MySQL,除了调整服务器设置外,你无能为力:在临时内存中保留更多操作,少写入磁盘。但是,服务器仍需要将操作记录到一个日志文件中。 ACID并不便宜。
因此,大多数服务器使用其他类型的临时存储,例如memcached或其他东西。这样,值就存储在RAM中,并且只有当值达到某个阈值时,才会将其写入数据库。
答案 1 :(得分:1)
这是最好的方法。
显然更新需要的时间比select更多,因为它意味着存储修改,而选择通常使用各种缓存和缓冲区。
如果速度对您非常重要 - 您可以设置任何队列软件并将增量任务添加到队列中,并由一些背景工作者以批量方式刷新数据。此解决方案效率会更高,但只有在您不需要立即更改时才适用。
答案 2 :(得分:1)
通常,更新比读取慢得多。鉴于id
已编入索引并且您正在使用的数据集很大,因此您无法做更多事情。以下页面介绍了可以提高性能的方法或添加LIMIT子句。
获得快速更新的另一种方法是延迟更新,然后执行许多操作 稍后更新。一起执行多个更新很多 如果您锁定桌子,则比一次做一件快。
答案 3 :(得分:0)
如果您只是在减少页面加载时间并且您的服务器设置为php-fpm / FastCGI后,您可以调用fastcgi_finish_request(),然后更新点击计数器,请参阅http://php-fpm.org/wiki/Features#fastcgi_finish_request.28.29
基本上,这会将输出刷新到客户端并关闭连接,然后继续执行PHP脚本,因此客户端不必等待计数器更新操作。这不会卸载服务器,只是客户端的访问时间......