26

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

前もって感謝します。

4

5 に答える 5

35

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

詳細と速度比較については、ブログを参照してください。

于 2008-10-29T18:45:15.840 に答える
4

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

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

于 2008-10-29T23:31:26.060 に答える
3

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

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

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

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

于 2008-10-29T18:14:48.180 に答える
0

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); ?>

説明:

host: ホスト名または 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_pconnset() で毎回データベースを接続する必要はありません。

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

于 2016-02-25T06:48:35.500 に答える