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

nic*_*ckb 7 php mysql performance pdo

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

从字面上看,我需要做的就是:

SELECT price, sqft, zipcode FROM homes WHERE home_id = X
Run Code Online (Sandbox Code Playgroud)

当我使用PHP PDO时,我读过的是连接到MySQL数据库的推荐方法,只需创建连接就需要610毫秒.

我的代码如下:

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');
}
Run Code Online (Sandbox Code Playgroud)

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

Mar*_*c B 12

如果缓慢是由于必须通过网络到达每个连接,并且mysql必须执行反向DNS查找以检查其GRANTs表,那么该开销可能很好地解决了大部分延迟.切换到持久连接将使其成为连接生命周期的一次性成本.

然而,这确实导致了其他问题.由于事务被回滚并且当持有它们的连接关闭时释放锁定,因此持续存在意味着它们将保持活动状态.如果不仔细处理代码以避免连接处于不一致状态,您可能会创建死锁或至少锁定所有其他连接,直到您手动进行清理.


sha*_*mar 8

最快的可能:

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)));
Run Code Online (Sandbox Code Playgroud)

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

  • mysqli*是*mysql改进的. (3认同)
  • mysqli速度很快,是php.net手册中使用的建议版本(在mysql和mysqli之间).如果我错了,我希望有人会纠正,PDO的主要优点是它可以连接到所有类型的数据库而不仅仅是mysql. (2认同)

Dwz*_*wza 7

猜猜PDO和MYSQLI一样快.我认为你的问题是你如何与PDO联系.你的connectionstring看起来像是这样的:

:host=localhost;:dbname=foo
Run Code Online (Sandbox Code Playgroud)

并且存在问题...... PDO尝试连接到localhost,但是PDO使用DNS 将localhost转换为127.0.0.1,这就是花费时间.如果您直接使用127.0.0.1,则不会再遇到这些问题:)所以connectionstring必须看起来像

:host=127.0.0.1;:dbname=bar
Run Code Online (Sandbox Code Playgroud)

  • 对我来说这个解决方案有效 查询时间从1秒减少到9毫秒! (3认同)