PHP: Какой самый быстрый способ запросить MySQL?Потому что PDO мучительно медленный - PullRequest
7 голосов
/ 04 сентября 2010

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

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

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

Когда я использую PHP PDO , который я прочитал, это рекомендуемый способ подключения к 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 для выполнения запроса выше?

Ответы [ 4 ]

12 голосов
/ 04 сентября 2010

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

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

8 голосов
/ 04 сентября 2010

Самый быстрый:

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.

7 голосов
/ 17 июля 2013

Думаю, 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
1 голос
/ 04 сентября 2010

, начиная с версии 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 ;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...