Php 为什么这个查询异常长?
我正在对网站“初始化”代码的各个部分进行计时(包括验证用户是否登录、连接到数据库、导入功能……) 目前,该查询本身大约占用了总初始化时间的一半:Php 为什么这个查询异常长?,php,mysql,time,Php,Mysql,Time,我正在对网站“初始化”代码的各个部分进行计时(包括验证用户是否登录、连接到数据库、导入功能……) 目前,该查询本身大约占用了总初始化时间的一半: $sql = "update `users` set `lastclick`=now(),".(substr($_SERVER['PHP_SELF'],0,6) == "/ajax/" ? "" : " `lastactive`=now(),")." `lastip`='".addslashes($_SERVER['REMOTE_ADDR'])."'
$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
ing用户数据、验证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
解开了我自己的谜团。结果表明,正在更新的一个字段(
lastactive
)位于索引中,重建该索引的速度较慢
由于该索引唯一可以使用的时间是更新在线用户列表,并且只能由cron每隔一段时间更新一次,因此我删除了该索引,现在查询的运行速度大大加快
感谢那些试图帮助我的人——你确实间接地帮我找到了问题 如果您可以通过命令行或类似的方式访问数据库,我会这样做:解释更新
用户
设置lastclick
=now(),lastactive
=now(),lastip
=192.168.0.1',其中id
=1;这将为您提供更多信息,这将有助于找出缓慢查询的来源。如果你不明白输出的意思,就把它贴在你原来的帖子里,我们会更好地帮助你。你想解释一下吗?我想您在id
列上有索引吧?您是否尝试过分析查询@EmmanuelG:EXPLAIN
仅适用于SELECT
,但对于id=1的用户,EXPLAIN-SELECT*可能值得在MySQL 5.6中对更新语句执行EXPLAIN-SELECT*。也许以前没有@EmmanuelG:I stand correct.EXPLAIN
为select添加的结果-尝试更新时出现语法错误。