Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP:What';查询MySQL的最快方法是什么?因为PDO非常慢_Php_Mysql_Performance_Pdo - Fatal编程技术网

PHP:What';查询MySQL的最快方法是什么?因为PDO非常慢

PHP:What';查询MySQL的最快方法是什么?因为PDO非常慢,php,mysql,performance,pdo,Php,Mysql,Performance,Pdo,我需要执行一个简单的查询 事实上,我需要做的就是: SELECT price, sqft, zipcode FROM homes WHERE home_id = X 当我使用PHPPDO时,我已经读到了连接MySQL数据库的推荐方法,简单地创建连接需要610ms的时间 我的代码如下: try { $conn_str = DB . ':host=' . DB_HOST . ';dbname=' . DB_NAME; $dbh = new PDO($conn_str, DB_USE

我需要执行一个简单的查询

事实上,我需要做的就是:

SELECT price, sqft, zipcode FROM homes WHERE home_id = X
当我使用PHPPDO时,我已经读到了连接MySQL数据库的推荐方法,简单地创建连接需要610ms的时间

我的代码如下:

try {
    $conn_str = DB . ':host=' . DB_HOST . ';dbname=' . DB_NAME;
    $dbh = new PDO($conn_str, DB_USERNAME, DB_PASSWORD);
    $params = array();    
    $sql = 'SELECT price, sqft, zipcode FROM homes WHERE home_id = :home_id';
    $params[':home_id'] = X;
    $stmt = $dbh->prepare($sql);    
    $stmt->execute($params);
    $result_set = $stmt->fetchAll(PDO::FETCH_ASSOC);
    // json output  
    ob_start("ob_gzhandler");
    header('Content-type: text/javascript; charset=utf-8');
    print "{'homes' : ";
    print json_encode( $result_set );
    print '}';
    ob_end_flush();
    $dbh = null;
} catch (PDOException $e) {
    die('Unable to connect');
}

问题:连接MySQL数据库以执行上述查询的最快方式是什么?

最快方式:

mysqli_connect("servername", "user", "pass") or die("can't connect");
mysqli_select_db("dbname") or die("can't select database");

list($price, $sqft, $zipcode) = mysqli_fetch_array(mysqli_query("SELECT price, sqft, zipcode FROM homes WHERE home_id = ".mysqli_real_escape_string($home_id)));

[编辑]:现在使用mysqli而不是mysql。

如果速度慢是因为每次连接都必须通过网络进行访问,而mysql必须进行反向DNS查找以检查其授权表,那么这种开销很可能会造成很大的延迟。切换到持久性连接将使其成为连接寿命的一次性成本


然而,这确实会导致其他问题。由于事务会在连接关闭时回滚并释放锁,因此持续运行意味着它们将保持活动状态。如果在代码中不小心使连接处于不一致的状态,很可能会造成死锁或至少锁定所有其他连接,直到手动进入并清理。

从php 5.3.0版开始,从php调用db的最快、最轻量级方法如下:

本例使用mysql/ext(不是mysqli)并调用存储过程

$conn = mysql_connect("localhost", "user", "pass");
mysql_select_db("db");

$sql = sprintf("call get_user(%d)", 1);

$result = mysql_query($sql);

mysql_free_result($result);
mysql_close($conn);
存储过程:

delimiter #
create procedure get_user
(
in p_user_id int unsigned
)
begin
    select 
     u.user_id, u.username, u.status_id, s.name as status_name, ...
    from 
        users u
    inner join user_status s on u.status_id = s.status_id
    ...
    where 
      u.user_id = p_user_id;
end #

delimiter ;

我猜PDO和MYSQLI一样快。 我认为你的问题在于如何与PDO联系。 很可能您的连接字符串如下所示:

:host=localhost;:dbname=foo
还有一个问题。。。PDO尝试连接到本地主机,但PDO使用DNS将本地主机转换为127.0.0.1,这需要时间。 如果您直接使用127.0.0.1,您将不再有这些问题:) 所以连接字符串必须看起来像

:host=127.0.0.1;:dbname=bar


您是否在home\u id中设置了索引?您正在通过本地主机进行连接吗?尝试使用mysql或mysqli(即mysqli连接、mysqli查询等)是的,我的主页id上有一个索引。我的web服务器与我的mysql数据库服务器位于不同的物理服务器上,这是您出现问题的主要原因。您可以尝试在会话/存储的文件中缓存数据。@user434493:如果您的web服务器与MySQL数据库位于不同的物理计算机上,则网络延迟很可能是罪魁祸首,即使它们在同一个房间中紧挨着坐在一起。您确定这是库问题吗,不是特别的服务器一号?所以本机mysql_uu库比PDO快?@user434493,是的。抽象越少,速度就越快。您上面的代码不是为SQL注入打开了大门吗?使用PDO的主要好处之一是,它可以保护您免受SQL查询字符串上的安全攻击。此外,PDO提供了准备好的语句,而mysqli_connect则没有。这难道不允许PDO更快吗?mysqli很快,是php.net上手册推荐使用的版本(介于mysql和mysqli之间)。我希望有人会纠正我的错误,PDO的主要优点是它可以连接到所有类型的数据库,而不仅仅是mysql。关于持久连接的有用阅读:以及这篇关于PDO的文章:@user434493-如果你决定使用持久连接来解决网络问题,使用PDO可能是明智之举。我遇到了一种情况,即我正在以百分比的形式返回投票结果。我不知道哪种方法会更快?在查询中计算百分比还是在php中处理百分比?如果使用单引号而不是双引号,可能会快一毫秒左右。@IanWarner single quotes当没有变量时,双引号会产生相同的c代码执行。@Jon Black嗨,我对存储过程有一个疑问这对我来说没有任何区别。我在基于Linux的系统上测试了100万行样本-使用“localhost”和127.0.0.1的结果是相同的。@pdolinaj花费的时间不是它自己的语句。。这是行刑的开始。在我的测试中,
127.0.0.1
localhost
解决方案更早地开始查询数据。对我来说,这个解决方案很有效。查询时间从1秒缩短到9ms!