質問
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-<!> gt; query(<!> quot; INSERT INTO ... <!> quot;)のようなものを使用します。使用している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を使用したり、 some その他 ライブラリ。
私は、人々がPDOを使用しているときにスピードが求めているとは思いません-違いがあるかどうかはわかりませんし、正直に気にしません:私がカップルをしている限りページ生成時のデータベースへのクエリの数、PHP側で数ミリ秒は何も変更しません。
mysql_*
:
- データベース間のほぼ一定のインターフェイス。
pg_*
、oci_*
、mysqli_*
、... を使用するよりも良い
- オブジェクト指向API ( <=> にはOO-APIがありますが、<=>はありません)
- MySQLの新機能をサポート<!> gt; = 4.1 (<=>と同じですが、<=>は再度)
ところで:私は一般にPDOを使用しています-<!> quot; by hand <!> quot ;、または Zend Framework および/または Doctrine 。
補足:PDOを使用しない場合でも、mysqlの代わりにmysqliを使用することをお勧めします。
PHPマニュアルのこのページを参照してください。
>- PDOを使用すると、バインドされたパラメーターを使用でき、ほとんどのSQLインジェクション攻撃を防ぐことができます。
- PDOプリペアドステートメントを使用すると、より高速になります。
- すべてのdbバックエンドへの標準インターフェース
- 多数の便利なメソッド(fetch *ファミリーなど)があります
準備済みステートメントと通常の直接クエリ(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抽象化を使用するプラクティスに入る方が良いと思います。ベストプラクティスに勝ちましょう。
どちらの場合も、同じPhpサーバーから同じmySQLサーバーを呼び出すので、多くの違いに気付くことはありません。
良好なパフォーマンスが必要な場合は、キャッシュ(memcacheまたは単純なPhpファイル...)について考え、適切なデータベース構造(INDEX ...)を作成します
- PDOはSQlよりも優れています
- PDOとそのPrepareステートメントは、SQLインジェクションに対して最も安全なコードを提供します
- PDOはオブジェクト指向です;)
- PDOは、以前に説明された一部のデータベースエンジンと互換性があります
- MySQLl_ *は非推奨であり、まもなく削除されます
-
PDOは、より少ないコード行でより多くの機能を提供します例:
Pdo
- 接続
- <!> quot; <!> lt; <!> quot;を確認します。 <!> quot; <!> gt; <!> quot;そして<!> quot;#<!> quot; (このグローバルな使用のチェック)
- 準備
- 実行
- 閉じる
MySQL _ *
- 接続
- バックスラッシュを追加
- Xsafe
- <!> quot; <!> lt; <!> quot;を確認します。 <!> quot; <!> gt; <!> quot;そして<!> quot;#<!> quot; (このグローバルな使用のチェック)
- クエリ
- 閉じる
両方の機能は同じですが、コードを比較します PDOはより人間に読みやすいです:) どう思いますか?
パフォーマンスが<!> quot;本当の問題<!> quotではない場合;あなたのために、あなたはPDOを使うべきです。パフォーマンスにはわずかな差があり、PDOには非常に優れた移植性のあるクロスデータベースインターフェイスがあり、複数のデータベースドライバーを使用する必要がある場合に頭痛の種を減らすことができます。
PDOのいくつかの利点:
- 複数のデータベースにアクセスできます。
- さまざまな異なるデータベースに接続するための多くのデータベースドライバーを提供。
- あるデータベースから別のデータベースに切り替える場合、新しいデータベースに接続するためにすべてのコードを記述する必要はなく、新しいデータベースに必要な接続文字列とクエリを変更するだけです。
- prepareステートメントを提供します。これは、1回だけコンパイルされ、プレースホルダーと呼ばれる属性を変更するだけで、何度でも実行できるクエリのテンプレートの一種です。
- 挿入、更新などの簡単で効率的な一般操作
PDOデータベース接続コード:
<?php
$dbhost = 'localhost';
$dbname = 'clsrepair';
$dbuser = 'root';
$dbpass = '';
try {
$db = new PDO("mysql:host={$dbhost};dbname={$dbname}",$dbuser,$dbpass);
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
}
catch(PDOException $e) {
echo "Connection error: ".$e->getMessage();
}
?>
通常のMySQLデータベース接続コード:
<?php
mysql_connect("localhost","root", "");
mysql_select_db ("clsrepair");
?>
または
<?php
$dbHost = 'localhost'; // usually localhost
$dbUsername = 'root';
$dbPassword = '';
$dbDatabase = 'clsrepair';
$db = mysql_connect($dbHost, $dbUsername, $dbPassword) or die ("Unable to connect to Database Server.");
mysql_select_db ($dbDatabase, $db) or die ("Could not select database.");
?>
MySQLデータベース接続コードは簡単ですが、PDOには多くの利点があります。