为什么一个简单的MySQL查询执行时间超过5秒?


Why is a simple MySQL query taking over 5 seconds to execute?

更新2011/12/12:现在在我的(基于iis的)托管包上隔离为FastCGI。我让他们把它关掉,因为一个计划任务总是超时。我知道我现在在哪里。再次感谢大家。

马克Iliff


更新2011年12月11日:好吧,我不得不举起我的手无意的误导。

感谢您的许多建议,我现在已经确定这是我的托管包上的PHP页面的问题,而不是专门的MySQL。一个空的PHP页面仍然需要5-6秒来加载,而带有ASP或HTML扩展的相同页面加载速度太快而无法测量。

很抱歉没有想到先检查这个,感谢你的投入:非常感激。

马克Iliff


我是MySQL/PHP的新手,我怀疑我做了一些愚蠢的事情:

        <?
        // Slave page: block/unblock merchant
        $id = $_POST["id"] ;
        $val = $_POST["val"] ;
        if ( isset( $id ) && isset( $val ) ) {
            $conx = mysqli_connect ( "sql05", $dbAc, $dbPwd, "finewine" ) 
                or die ("Conx failed") ;
            // update record
            $sql = "UPDATE wsMerchants SET 
                blockem = ".$val.", updateDT = '".date( "Y-m-d H:i:s" )."' 
                WHERE id = ".$id.";" ;
            $result = mysqli_query( $conx, $sql ) ;
            //tidy
            mysqli_close( $conx ) ;
            };
        ?>
Result of SHOW CREATE:
CREATE TABLE `wsmerchants` (
 `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
 `merchant` text NOT NULL,
 `country` tinytext NOT NULL,
 `blockem` tinyint(1) DEFAULT '0',
 `benchmark` tinyint(1) DEFAULT '0',
 `createDT` datetime NOT NULL,
 `updateDT` datetime NOT NULL,
 UNIQUE KEY `id` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=119 DEFAULT CHARSET=utf8

我从JQuery调用这个(使用$.post)。db表有29条记录和7个字段。

它是有效的,但是非常慢。

对于像这样的古老的Access (+ Classic ASP)查询,对于所有实际目的来说,都是即时的。在MySQL中,根据Firebug中的计时器,查询需要5-6秒。

我在一个托管的Windows环境中运行MySQL 5.0.51a + PHP 5.2.13

我在这里搜索了其他问题,但它们似乎主要涉及复杂的SQL查询。

撇开其他问题不谈,我怀疑这里的瓶颈是查询。

首先,从MySQL控制台尝试查询,以确保您的数据库服务器正常。

然后,制作一个简单的测试脚本,它只连接到数据库,不执行任何查询。请确保在connect调用之后放置一些东西,以便您可以看到它何时完成连接。

这是我的猜测——瓶颈在于数据库连接。

还有一件事,这是Windows中的AMP堆栈(WAMP, XAMPP),还是您通过IIS运行PHP ?

我在这个查询中没有看到任何需要>5秒的内容。Firebug可能会给您整个请求的时间,而不仅仅是查询的时间。也就是说,如果客户机和应用服务器之间或应用服务器和数据库之间的延迟特别高,那么5秒不是不可想象的。我将首先对脚本进行基准测试,以弄清楚究竟是什么花费了这么长时间。您可以通过在整个脚本中使用microtime()获取时间戳,然后减去它们来计算脚本的每个部分花费的时间。

从评论中的对话来看,您的问题似乎是与网络有关,而不是与您的代码有关。我的直觉告诉我,这可能是DNS问题,在这种情况下,您可能需要查看MySQL手册的这一部分。或者,尝试在连接字符串中使用IP地址而不是"sql05",看看是否会加快速度。