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!