Мне нужно выполнить простой запрос.
Буквально все, что мне нужно, это:
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 для выполнения запроса выше?
Самый быстрый из возможных:
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, то эти накладные расходы могут очень хорошо учитывать большой фрагмент задержки. Переход на постоянные соединения сделает его единовременной стоимостью для жизни соединения.
Однако это приводит к проблемам. Поскольку транзакции откатываются и блокируются, когда соединение, удерживающее их, закрывается, переживание остается постоянным, так как они остаются активными. Не проявляя особой осторожности в своем коде, чтобы не покидать соединение в непоследовательном состоянии, вы вполне можете создать тупик или, по крайней мере, заблокировать все другие соединения, пока не будете вручную и не очищены.
Guess 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 самый быстрый и легкий способ вызова в db из 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 ;