web-dev-qa-db-ja.com

mysql_connect VS mysql_pconnect

私はこの疑問を持っています、私はウェブを検索しました、そして答えは多様化されているようです。 PHPを介してデータベースに接続する場合は、mysql_connectではなくmysql_pconnectを使用する方がよいでしょうか。 pconnectの拡張性ははるかに優れていると読みましたが、一方で、持続的接続である...同時に10000の接続があり、すべてが持続的であるため、私にはスケーラブルではないようです。

前もって感謝します。

25
rogeriopvl

MySQLでは持続的接続は不要です。他のデータベース(Oracleなど)では、接続の確立には費用と時間がかかるため、接続を再利用できれば大きなメリットがあります。しかし、これらのブランドのデータベースは、問題をより適切に解決する接続プールを提供します。

MySQLデータベースへの接続は、他のブランドに比べて迅速であるため、永続的な接続を使用すると、MySQLのメリットは他のブランドのデータベースよりも比例して少なくなります。

持続的接続にも欠点があります。データベースサーバーは、接続が必要かどうかに関係なく、各接続にリソースを割り当てます。そのため、接続がアイドル状態の場合、目的のない多くの無駄なリソースが表示されます。 10,000のアイドル接続に到達するかどうかはわかりませんが、数百の接続でもコストがかかります。

接続には状態があり、PHPリクエストが、以前に別のPHPリクエストによって使用されたセッションから情報を「継承」する」ことは不適切です。たとえば、一時的なテーブルとユーザー変数は通常、接続が閉じるときにクリーンアップされますが、永続的な接続を使用する場合はクリーンアップされません。同様に、文字セットや照合などのセッションベースの設定。また、LAST_INSERT_ID()は、セッション中に最後に生成されたIDを報告します。 -それが以前のPHPリクエスト中だったとしても。

少なくともMySQLの場合、持続的接続の欠点はおそらくその利点を上回ります。また、高いスケーラビリティを実現するためのより優れた手法は他にもあります。


2014年3月の更新:

MySQLの接続速度は、他のブランドのRDBMSと比較して常に低速でしたが、さらに向上しています。

http://mysqlserverteam.com/improving-connectdisconnect-performance/ を参照してください

MySQL 5.6では、接続と切断を処理するコードの最適化に取り組み始めました。そして、この作業はMySQL5.7で加速されました。このブログ投稿では、最初に私たちが達成した結果を示し、次にそれらを得るために私たちが何をしたかを説明します。

詳細と速度の比較については、ブログをお読みください。

34
Bill Karwin

基本的に、接続を作成するコストと接続を維持するコストのバランスをとる必要があります。 MySQLは新しい接続のセットアップが非常に高速ですが、それでもコストがかかります。スレッドのセットアップ時間と、WebサーバーからのTCP/IPのセットアップ時間です。これは、トラフィックの多いサイトで顕著です。残念ながら、PHPは接続の永続性を制御できません。したがって、答えはMySQLのアイドルタイムアウトを大幅に短縮し(20秒まで)、スレッドを増やすことです。キャッシュサイズ。一緒に、これは一般的に非常にうまく機能します。

反対に、アプリケーションは接続の状態を尊重する必要があります。セッションがどのような状態にあるかを想定しないのが最善です。一時テーブルを使用する場合は、CREATE IF NOTEXISTSとTRUNCATETABLEを使用すると、一意の名前(ユーザーIDなど)と同様に非常に役立ちます。トランザクションはもう少し問題があります。ただし、万が一の場合に備えて、コードは常に上部でROLLBACKを実行できます。

4
staticsan

10000の接続に到達する可能性はほとんどありません。とにかく、 公式ソース に移動します。 (エンファシスマイン)。

持続的接続に追加機能がない場合、それらは何に役立ちますか?

ここでの答えは非常に単純です-効率。 SQLサーバーへのリンクを作成するためのオーバーヘッドが高い場合は、持続的接続が適しています。このオーバーヘッドが本当に高いかどうかは、多くの要因に依存します。たとえば、データベースの種類、Webサーバーが置かれているのと同じコンピューター上にあるかどうか、SQLサーバーが置かれているマシンの負荷などです。 肝心なのは、その接続オーバーヘッドが高い場合、持続的接続がかなり役立つということです。これにより、子プロセスは、SQLサーバーへの接続が必要なページを処理するたびにではなく、ライフスパン全体で1回だけ接続します。これは、永続的な接続を開いたすべての子に対して、サーバーへの独自の開いた永続的な接続があることを意味します。たとえば、SQLサーバーへの永続的な接続を確立するスクリプトを実行する20の異なる子プロセスがある場合、SQLサーバーへの接続は各子から1つずつ、20になります。

ただし、永続的な子接続が接続制限を超えるデータベースを使用している場合、これにはいくつかの欠点があることに注意してください。データベースの同時接続数が16に制限されていて、サーバーセッションがビジー状態のときに、17の子スレッドが接続を試行すると、1つは接続できなくなります。スクリプトに接続をシャットダウンできないバグ(無限ループなど)がある場合、16接続しかないデータベースが急速にいっぱいになる可能性があります。放棄された接続またはアイドル状態の接続の処理については、データベースのドキュメントを確認してください。

3
Vinko Vrsalovic

mysql_connect()mysql_pconnect()はどちらもデータベース接続で機能していますが、ほとんど違いはありません。 mysql_pconnect()では、pは永続性接続を表します。

mysql_connect()関数を使用している場合、要求に応じて、データベース接続を開いたり閉じたりするたびに。

しかし、mysql_pconnect()関数の場合:

  • まず、接続時に、関数は同じホスト、ユーザー名、およびパスワードですでに開いている(永続的な)接続を見つけようとします。見つかった場合は、新しい接続を開く代わりに、その識別子が返されます。

  • 次に、スクリプトの実行が終了しても、SQLサーバーへの接続は閉じられません。代わりに、接続は将来の使用のために開いたままになります(mysql_close()mysql_pconnect()によって確立された接続を閉じません)。

mysql_pconncet()は、サイトに大量のトラフィックがある場合に役立ちます。その時点で、すべてのリクエストに対して、接続は開かれませんが、プールから取得されます。これにより、サイトの効率が向上します。ただし、一般的な使用にはmysql_connect()が最適です。

3
Phoenix

MYSQL_CONNECT()

1.mysql_connectを使用して、接続を閉じることができます。要求に応じて、データベース接続を開いたり閉じたりするたびに。

2.ここでデータベースはページがMYSQL接続にロードされるたびに開かれます

3.ページが読み込まれると、データベースは毎回読み込まれます

4.接続を閉じるために使用されます

例:

<?php $conn = mysql_connect(‘Host’, ‘mysql_user’, ‘mysql_password’); if(!$conn){ die(‘Could not connect: ‘ . mysql_error()); } echo ‘Connected successfully’; mysql_close($conn); ?>

説明:

ホスト:ホスト名またはlocalhostなどのIPアドレスを指定します。

mysql_user:MySQLユーザー名を指定します

mysql_password:MySQLパスワードを指定します

MYSQL_PCONNECT()

1. mysql_pconncet()を使用します。最初に、開いている持続的接続を見つけようとします。

2. mysql_pconncet()が永続的な接続を開きます

3. mysql_pconnect()はクローズ接続をサポートしていません

4.mysql_pconnect()は接続を閉じることができません。ここで、データベースへの永続的な接続を開きます

5.ここでデータベースは毎回接続する必要はありません。

6. mysql_pconncet()でデータベースを毎回接続する必要はありません。

詳細: http://prittytimes.com/difference-between-mysql_connect-and-mysql_pconnect/

0
Pritty M