11
回答
mysql查询缓慢,不得其解,求助
滴滴云服务器,限时包月0.9元,为开发者而生>>>   
  • 重新配置了一台服务器,准备进行替换, 
原来的配置是
Apache/2.4.7 (Win32) OpenSSL/1.0.1e PHP/5.4.23 libmysql - mysqlnd 5.0.10 - 20111026
现在的配置是
Apache/2.4.17 (Win32) PHP/5.4.45 libmysql - mysqlnd 5.0.10 - 20111026
版本更新了一下

作为从服务器测试的时候,读取远程数据库,很慢,5、6秒的样子,觉得不可思议,于是更换成本地数据库(设置了主从备份的)
并单独做了个页面进行测试,结果一样的是5、6秒的样子
开phpmyadmin进行查询,速度不慢,进mysql命令行查询,0秒(这个应该是理所当然的结果)

迷茫了……100多行的数据查询竟然花了5、6秒?
(连接地址使用的localhost)

均使用的mysql库,求指点一下可能是什么地方出了问题。

更换为mysqli测试,竟然也是一样的5、6秒的样子……

我想可能还是什么地方我不清楚,因为phpmyadmin的查询速度也并不算慢(查看响应大约100多ms的样子)

只是我实在想不到在代码部分还会有什么需要注意的(网络上多见使用127.0.0.1的方式,更换这个也是不行的)

测试代码如下:

    require(ROOT.CLS_TIMER);
    $c=new timer();

	$db=mysql_connect($var['dbhost'],$var['dbuser'],$var['dbpsw']) or die();
	if(!$db){return 0;}
	mysql_select_db($var['DBNAME'],$db) or die();//echo('db enter here');
	//mysql_query("SET NAMES 'UTF8'");

	$sql='select * from `table1` ';
	$c->stop();
	$v1=$c->spent();
	$c->start();
	//$rs=run_sql($sql);
	$rs=mysql_query($sql,$db);
	$c->stop();
	$v2=$c->spent();
	$c->start();
	$rs=rs_2_array($rs);
	$c->stop();
	$v3=$c->spent();
	$data['rs']=$rs;
	$data['v1']=$v1;$data['v2']=$v2;$data['v3']=$v3;
	diehere($data);
$db= mysqli_connect ($var['dbhost'],$var['dbuser'],$var['dbpsw'],$var['dbname'])or die();
	//$db=mysql_connect() 
//	if(!$db){return 0;}
	//mysql_select_db(constant('DBNAME'),$db) or die();//echo('db enter here');
	//mysqli_query($db,"SET NAMES 'UTF8'");

	$sql='select * from `table1` ';
	$c->stop();
	$v1=$c->spent();
	$c->start();
	//$rs=run_sql($sql);
	//$rs=mysql_query($sql,$db);
	$rs=mysqli_query($db,$sql);
	$c->stop();
	$v2=$c->spent();
	$c->start();
	//$rs=rs_2_array($rs);
	$c->stop();
	$v3=$c->spent();
	//$data['rs']=$rs;
	$data['v1']=$v1;$data['v2']=$v2;$data['v3']=$v3;
	diehere($data);
是吧?上面的查询代码如此之简单直接,所以我就迷糊了……

用时间查看的话过程就在mysql(i)_query这条语句执行的时候慢得令人发指…………5、6秒的速度……


求大神指点一二!

举报
流海
发帖于2年前 11回/579阅

以下是问题补充:

  • @流海 :晕,没写上连接字符串。 主机用的localhost,后来网上查到说用127.0.0.1,设置了无效,检查hosts文件正常。 而且还有一点,关于连接的时候,修改mysql配置 --revoke-host-name(大意如此,即mysql不使用dns检查)这样的结果一样的无效,而且phpmyadmin也没登陆进去了(phpmyadmin我配置的是localhost) 然后……phpmyadmin依然跑得很欢畅,一次查询100ms左右。 (2年前)
共有11个答案 最后回答: 2年前

(连接地址使用的localhost) 

这知识积累....用127.0.0.1

还是要提醒一句, 加速进入php5.6系列, 真心提醒. 

引用来自“Tuesday”的评论

(连接地址使用的localhost) 

这知识积累....用127.0.0.1

还是要提醒一句, 加速进入php5.6系列, 真心提醒. 

天地良心,你看我的测试代码,用的就是127.0.0.1

本来是准备更新到php5.5以上的,因为版本更新极大,对支持组件的要求也高了,折腾了半天……操作系统又不支持,无法,只得升了个4.5的版本

引用来自“Tuesday”的评论

(连接地址使用的localhost) 

这知识积累....用127.0.0.1

还是要提醒一句, 加速进入php5.6系列, 真心提醒. 

引用来自“流海”的评论

天地良心,你看我的测试代码,用的就是127.0.0.1

本来是准备更新到php5.5以上的,因为版本更新极大,对支持组件的要求也高了,折腾了半天……操作系统又不支持,无法,只得升了个4.5的版本

php7下月就要来了, 现在还在写mysq_*的函数? 

还有mysql 5.7的json, 强烈建议加速升级. 


引用来自“Tuesday”的评论

建议写一段原生的连接测试.
最开始的确是用的连接方法,发现不对后也怀疑是连接问题,提问中给出的mysql和mysqli不就是用的php的原生方法吗?

引用来自“走起来”的评论

phpmyadmin也没登陆进去, 是什么意思?

网上根据 php mysql查询慢找到的结果就两种处理办法,一种是连接用ip来走,一种是mysql配置--revoke-host-name

配置rvn后就只能用ip访问。在测试php文件中证实也的确如此。

而在我的环境中,phpmyadmin也登陆不上去了。

也是我没有描述清楚,我直接说”phpmyadmin的连接配置用的是localhost,且一切正常”就完了。

引用来自“走起来”的评论

感觉是连接主机有问题, 不是逻辑问题.

正常碰到这种情况,第一反应是mysql环境有问题,但是在命令行下测试正常

第二是php环境有问题,但是phpmyadmin正常,

第三是连接函数有问题,于是我没有用自己的连接函数,按照php标准方式来写,也有问题……我凌乱了,把php手册翻过来倒过去读了几遍,愣是没有发现在当前版本下有什么特殊需要注意的地方

一直用的mysql库,这库5.5(还是v6?)后不是mysql_query被阉割了吗?于是又换成mysqli库测试,结果也一样!而坑爹的是phpmyadmin还跑得一切正常,现在不知道phpmyadmin用的是pdo还是mysqli,但是我已经不知道是怎么回事了。

好嘛……刚才翻phpmyadmin的代码,的确用的是mysql以及mysqli,这样我就更加的搞不清楚了……为啥我的代码就是这么慢?

下面是phpmyadmin的msyql类查询代码

public function realQuery($query, $link, $options)
    {
        if ($options == ($options | PMA_DatabaseInterface::QUERY_STORE)) {
            return mysql_query($query, $link);
        } elseif ($options == ($options | PMA_DatabaseInterface::QUERY_UNBUFFERED)) {
            return mysql_unbuffered_query($query, $link);
        } else {
            return mysql_query($query, $link);
        }
    }

mysqli中是这样

    public function realQuery($query, $link, $options)
    {
        if ($options == ($options | PMA_DatabaseInterface::QUERY_STORE)) {
            $method = MYSQLI_STORE_RESULT;
        } elseif ($options == ($options | PMA_DatabaseInterface::QUERY_UNBUFFERED)) {
            $method = MYSQLI_USE_RESULT;
        } else {
            $method = 0;
        }

        return mysqli_query($link, $query, $method);
    }



我不懂了……换成mysql_unbuffered_query测试还是一样的要花5、6秒钟

顶部