PHP: Какой самый быстрый способ запросить MySQL? Потому что PDO мучительно медленный

Мне нужно выполнить простой запрос.

Буквально все, что мне нужно сделать, это:

SELECT price, sqft, zipcode FROM homes WHERE home_id = X

Когда я использую 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');
}

Вопрос: Какой самый быстрый способ подключения к базе данных MySQL для выполнения вышеуказанного запроса?

4 ответа

Решение

Самый быстрый из возможных:

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)));

[EDIT]: теперь используется mysqli вместо mysql.

Если медлительность вызвана необходимостью доступа по сети для каждого соединения, и mysql вынужден выполнять обратный поиск DNS для проверки своей таблицы GRANTs, тогда эти издержки вполне могут составлять большую часть задержки. Переключение на постоянные соединения сделало бы единовременными затраты на срок службы соединения.

Однако это приводит к другим проблемам. Поскольку транзакции откатываются и блокировки снимаются, когда закрывающее их соединение закрывается, переход на постоянное состояние означает, что они останутся активными. Не проявляя особой осторожности в своем коде, чтобы не оставить соединение в несогласованном состоянии, вы вполне могли бы создать тупик или, по крайней мере, заблокировать все другие соединения, пока не войдете вручную и не выполните очистку.

Думаю, PDO так же быстр, как MYSQLI. Я думаю, что ваша проблема в том, как вы связываетесь с PDO. Вероятно, ваша строка подключения выглядит так:

:host=localhost;:dbname=foo

И есть проблема... PDO пытается подключиться к localhost, но PDO использует DNS, чтобы превратить localhost в 127.0.0.1, и это то, что стоит времени. Если вы используете 127.0.0.1 напрямую, у вас больше не будет этих проблем:) Так что строка подключения должна выглядеть так

:host=127.0.0.1;:dbname=bar

Начиная с версии php 5.3.0, самый быстрый и легкий способ вызова базы данных из php:

Этот пример использует 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 ;
Другие вопросы по тегам