PHPでデータベースクエリを実行するには、php PDOまたは通常のmysql_connectを使用する必要がありますか?
どちらが速いですか?
PDOの大きな利点の1つは、インターフェイスが複数のデータベース間で一貫していることです。プリペアドステートメントには、すべてのクエリ文字列をエスケープする手間を省くクールな関数もいくつかあります。 PDOの移植性はmysql_connectよりも優れています。
したがって、これらの理由でPDOを使用するか、従来のmysql_connectに固執する必要がありますか?
PDOはmysql_ *よりも少し遅いですが、移植性に優れています。 PDOは、複数のデータベースにわたって単一のインターフェースを提供します。つまり、mysqlにmysql_query、MS SQLにmssql_queryなどを使用せずに複数のDBを使用できます。常に$ db-> query( "INSERT INTO ...")などを使用します。使用しているDBドライバーに関係なく。
そのため、大規模またはポータブルなプロジェクトにはPDOが望ましいです。 zendフレームワークでさえPDOを使用します。
いくつかの速いタイミングは、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
とにかく速度の違いは無視できます。ネットワーク接続の確立には、特にmysqlサーバーが別のホスト上にある場合、PDOによって発生するオーバーヘッドよりもかなり長い時間がかかります。
PDOを使用するすべての理由を述べました。本当に、mysql_ *関数を直接使用しないでください。PDOを使用するか、 someotherlibrary を使用してください。
PDOを使用しているときに、人々が求めているのは速度だとは思いません-違いがあるかどうかはわかりませんし、正直に気にしません:いくつかのクエリを実行している限りページ生成時のデータベース、PHP側で数ミリ秒は何も変更しません。
mysql_*
と比較して、PDOには2つまたは3つの素晴らしい点があります。
mysql_*
、pg_*
、oci_*
、...を使用するよりも優れています.mysqli_*
にはOO-APIがありますが、mysql_*
はありません)mysqli_*
と同じですが、mysql_*
とは同じではありません)ところで、私は一般的にPDOを使用しています。「手動」で、または Zend Framework および/または Doctrine に統合/使用されています。
補足:PDOを使用しない場合でも、mysqlの代わりにmysqliを使用することをお勧めします。
PHP manual のこのページ)を参照してください。
準備済みステートメントと通常の直接クエリ(MysqlndおよびMyISAMテーブルでselectステートメントを使用してテスト)の両方を使用して、Mysqli関数をPDO関数と比較するパフォーマンステストを行いました。
PDOクエリはMysqliよりもわずかに遅いが、ほんの少しだけ遅いことがわかりました。これは、PDOがこの目的に使用されるのはほとんどMysqli関数を呼び出すラッパーだけであるため、理にかなっています。 PDOを使用する利点は、関数名がMySQLに固有ではないため、別のデータベースへの移行が少し簡単になることです。
実際のパフォーマンスの違いは、準備済みクエリを使用するかどうかです。大規模で重要なパフォーマンスがありますペナルティ準備済みクエリの使用。それらをテストした他の人々は同じ結果を見つけました。
クエリの準備が高速になるのは、クエリを1回準備してから、異なるデータ値で何千回も送信する場合のみです。それ以外の場合、mysqli :: query()またはPDO :: query()を使用する方が常に高速です。ただし、これらの関数はデータ値をエスケープしないことに注意することが重要です。そのため、データ変数でmysqli :: real_ escape_ string()またはPDO :: quote()を使用することを忘れないでください。
特別な理由がない限り、PDOを使用することをお勧めします。 2つの間にわずかな違いがなく、PDOを使用しない理由がない場合、単にmysql_ *を使用するよりも、アプリケーションでDB抽象化を使用する練習に入る方が良いと思います。私はベストプラクティスを勝ち取ろうと言うでしょう。
PDOは、より少ないコード行でより多くの機能を提供します例:
どちらも同じ機能ですが、コードを比較すると、PDOはより人間に読みやすくなります:)
どちらの場合も、同じPhpサーバーから同じmySQLサーバーを呼び出すため、多くの違いに気付くことはありません。
良好なパフォーマンスが必要な場合は、キャッシュ(memcacheまたは単純なPhpファイル...)について考え、適切なデータベース構造を作成します(INDEX ...)
パフォーマンスがあなたにとって「本当の問題」でない場合は、PDOを使用する必要があります。パフォーマンスにはわずかな差があり、PDOには非常に優れた移植性のあるクロスデータベースインターフェイスがあり、複数のデータベースドライバーを使用する必要がある場合に頭痛の種を軽減できます。
PDOのいくつかの利点: