0

我正在计时网站“初始化”代码的各个部分(包括验证用户是否登录、连接到数据库、导入功能......)

此查询目前独自占用了总初始化时间的一半以上:

$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
4

1 回答 1

2

解开了我自己的谜团。原来正在更新的字段之一 ( lastactive) 在索引中,而缓慢来自重建该索引。

由于唯一可能使用该索引的时间是更新在线用户列表,并且仅在每个设定的时间间隔由 cron 发生,所以我删除了索引,现在查询运行得快了很多。

感谢那些试图提供帮助的人——你确实间接地帮助我找到了问题!

于 2012-05-17T17:06:48.790 回答