PHP PDO против обычного mysql_connect - PullRequest
       19

PHP PDO против обычного mysql_connect

46 голосов
/ 10 сентября 2009

Должен ли я использовать php PDO или обычный mysql_connect для выполнения запросов к базе данных в PHP?

Какой из них быстрее?

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

Итак, должен ли я использовать PDO по этим причинам или придерживаться традиционного mysql_connect?

Ответы [ 12 ]

40 голосов
/ 10 сентября 2009

PDO немного медленнее, чем mysql_ * Но он обладает отличной мобильностью. PDO обеспечивает единый интерфейс для нескольких баз данных. Это означает, что вы можете использовать несколько БД, не используя mysql_query для mysql, mssql_query для MS sql и т. Д. Просто всегда используйте что-то вроде $ db-> query ("INSERT INTO ..."). Независимо от того, какой драйвер БД вы используете.

Итак, для более крупного или портативного проекта предпочтительнее PDO. Даже в Zend Framework используют PDO.

17 голосов
/ 10 сентября 2009

Некоторые быстрые тайминги указывают, что PDO немного быстрее при подключении.

$start = microtime(true);
for($i=0; $i<10000; ++$i) {

    try {
        $db = new PDO($dsn, $user, $password);
    } catch (PDOException $e) {
        echo 'Connection failed: ' . $e->getMessage()."\n";
    }
    $db = null;
}

$pdotime = microtime(true) - $start;
echo "PDO time: ".$pdotime."\n";

$start = microtime(true);
for($i=0; $i<10000; ++$i) {
    $db = mysql_connect($host, $user, $password);
    if(!$db) {
        echo "Connection failed\n";
    }
    if(!mysql_select_db($schema, $db)) {
        echo "Error: ".mysql_error()."\n";
    }
    mysql_close($db);
}

$rawtime = microtime(true) - $start;
echo "Raw time: ".$rawtime."\n";

Дает результаты как

PDO time: 0.77983117103577
Raw time: 0.8918719291687

PDO time: 0.7866849899292
Raw time: 0.8954758644104

PDO time: 0.77420806884766
Raw time: 0.90708494186401

PDO time: 0.77484893798828
Raw time: 0.90069103240967

Разница в скорости в любом случае будет незначительной; установление сетевого соединения, вероятно, займет много времени дольше, чем любые накладные расходы, понесенные PDO, особенно если сервер mysql находится на другом хосте.

Вы упомянули все причины использовать PDO самостоятельно. В самом деле, никогда не используйте функции mysql_ * напрямую, не используйте PDO или используйте some other library .

11 голосов
/ 12 сентября 2009
  • С PDO вы можете использовать связанные параметры, что предотвратит большинство атак инъекций sql.
  • Вы можете повысить скорость, используя подготовленные операторы PDO.
  • стандартный интерфейс для всех бэкэндов БД
  • Существует множество полезных методов (например, семейство fetch *)
11 голосов
/ 10 сентября 2009

Я не думаю, что скорость - это то, что люди ищут, когда используют PDO - я не знаю, есть ли разница, и мне, честно говоря, все равно: пока я делаю пару запросов к базе данных при генерации страницы, пара миллисекунд на стороне PHP ничего не изменит.

В PDO есть две / три замечательных вещи, по сравнению с mysql_*:

  • Более или менее постоянный интерфейс между базами данных; лучше чем mysql_*, pg_*, oci_*, ...
  • Объектно-ориентированный API (mysqli_* имеет OO-API, но не mysql_*)
  • Поддержка новых функций MySQL> = 4.1 (аналогично mysqli_*, но не mysql_*, опять же)

Кстати: я обычно использую PDO - либо «вручную», либо, поскольку он интегрирован в / используется Zend Framework и / или Doctrine .


Как примечание: даже если вы не собираетесь использовать PDO, обратите внимание, что рекомендуется использовать mysqli вместо mysql.

См. эту страницу руководства по PHP , об этом.

6 голосов
/ 30 апреля 2012

Я провел некоторое тестирование производительности, чтобы сравнить функции Mysqli с функциями PDO, используя как подготовленные операторы, так и обычные прямые запросы (протестировано с использованием операторов select в таблицах Mysqlnd и MyISAM).

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

Реальная разница в производительности заключается в том, используете ли вы подготовленные запросы. Существует большая и значительная производительность штраф за использование подготовленных запросов. Другие люди, которые проверяли их, нашли те же результаты.

Единственный раз подготовленные запросы выполняются быстрее, если вы готовите запрос один раз, а затем отправляете его тысячи раз с разными значениями данных. В противном случае всегда быстрее использовать mysqli :: query () или PDO :: query (). Но важно знать, что эти функции не экранируют значения данных для вас, поэтому вы должны помнить, что нужно использовать mysqli :: real_ escape_ string () или PDO :: quote () для переменных данных.

4 голосов
/ 10 сентября 2009

Как правило, я бы рекомендовал использовать PDO, если нет особой причины, по которой вы не можете. Если между ними нет разницы, и у вас нет причин не использовать PDO, я считаю, что было бы лучше начать практиковать использование абстракции БД в своих приложениях, чем использовать mysql_ * просто потому, что она есть. Я бы сказал, пусть победит лучшая практика.

3 голосов
/ 17 июня 2013
  • PDO лучше, чем SQl
  • PDO и его инструкция Prepare обеспечивают лучший защищенный код от SQL-инъекций
  • PDO является объектно-ориентированным;)
  • PDO совместим с некоторыми механизмами баз данных, как объяснено ранее
  • MySQLl_ * устарело и будет скоро удалено
  • PDO обеспечивает большую функциональность с меньшим количеством строк кода. Пример:

    PDO

    1. Соединение
    2. Проверка "<" И ">" И "#" (эта проверка для глобального использования)
    3. Подготовка
    4. Выполнить
    5. Закрыть

MySQL _ *

  1. Подключение
  2. Добавить обратную косую черту
  3. Xsafe
  4. Проверка "<" И ">" И "#" (эта проверка для глобального использования)
  5. Запрос
  6. Закрыть

обе функции одинаковы, но вы сравниваете коды ЗОП более понятна человеку :) Так что же ты думаешь?

3 голосов
/ 06 ноября 2010

В обоих случаях вы вызываете один и тот же сервер MySQL с одного и того же Php-сервера ... поэтому вы не заметите большой разницы.

Если вы хотите хорошую производительность, подумайте о кеше (memcache или простой файл Php ...) и создайте хорошую структуру базы данных (INDEX ...)

2 голосов
/ 23 декабря 2012

Функция mysql_connect устарела с версии PHP 5.5.0 и, как и большинство устаревших функций, будет удалена. Поэтому предпочтительнее использовать PDO_MySQL (или другую альтернативу MySQLi ) вместо mysql_connect.

Источник: http://php.net/manual/en/function.mysql-connect.php

2 голосов
/ 10 сентября 2009

Если производительность не является для вас «реальной проблемой», вам следует использовать PDO. Производительность отличается небольшими полями, а PDO имеет очень удобный и переносимый интерфейс кросс-баз данных, который может избавить вас от головной боли в случае необходимости использования нескольких драйверов баз данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...