我正在计算网站“初始化”代码的各个部分(包括验证用户已登录,连接到数据库,导入功能......)
此查询目前占用了总初始化时间的一半:
$sql = "update `users` set `lastclick`=now(),".(substr($_SERVER['PHP_SELF'],0,6) == "/ajax/" ? "" : " `lastactive`=now(),")." `lastip`='".addslashes($_SERVER['REMOTE_ADDR'])."' where `id`=".$userdata['id'];
生成查询根本不需要时间,这就是运行问题。示例结果查询:
update `users` set `lastclick`=now(), `lastactive`=now(), `lastip`='192.168.0.1' where `id`=1
简单的查询,对吗?我现在是服务器上唯一的用户,没有别的东西在运行。那么为什么简单的更新比连接到数据库需要更多的时间,首先SELECT
用户数据,验证cookie,并定义所有组合的功能?
(我只是尝试用文字值替换now()
,但这并没有什么区别 - 实际上它最初花了13毫秒而不是4 ...)
编辑:根据要求:
explain select * from `users` where `id`=1
1 row returned
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE users const PRIMARY PRIMARY 4 const 1
答案 0 :(得分:2)
解开了我自己的神秘面纱。事实证明,正在更新的一个字段(lastactive
)位于索引中,并且缓慢来自重建该索引。
由于唯一可以使用索引的时间是更新在线用户列表,并且每次设置间隔只发生在cron上,我已经删除了索引,现在查询运行速度快了很多
感谢那些试图帮助的人 - 你确实帮助我间接找到了问题!