HPレイヤーからMySQLレイヤーへ
Php から SQL へのコンポーネント階層は以下のとおりです:
ext/mysqli および ext/mysql はクライアント拡張ライブラリ (ライブラリ関数) であり、クライアント スクリプト レベルの拡張ライブラリです。 Mysqli ライブラリは、mysql ライブラリの拡張バージョンであり、列バインディング (Bind Column) バインディングが追加されます。 PDO (PHP Data Object) は、もう 1 つのデータ指向拡張ライブラリです。これらの拡張ライブラリはプログラマ向けであり、その基礎となる実装は mysqlnd や libmysql などの mysql 接続エンジンです) (http://bbs.chinaunix.net/thread-3679393-1-1.html、http:/ を参照) /blog.csdn .net/treesky/article/details/7286098)。 mysqlnd と libmysql は、PHP クライアントのデータベース接続ドライバー エンジンです)。 libmysql は一般的なデータベース接続エンジンですが、mysqlnd は PHP 専用に開発された Zend に属する接続エンジンです。 PHP が拡張ライブラリ ext/mysqli および ext/mysql) の mysql_query() 関数を呼び出してデータベース クエリを実行すると、Zend エンジンは mysqlmysqlnd および libmysql) クエリ エンジンを通じて MySQL サーバーにクエリ リクエストを発行します。
MySQL層でのデータクエリ
MySQL サーバーがクライアントのクエリ リクエストを受信した後のクエリ実行プロセスは、上の図に示すようになります。
1. キャッシュをクエリし、ヒットした場合は結果セットをクライアントに直接返します。そうでない場合はステップ 2 に進みます
2. SQL ステートメントに対して解析、前処理、クエリの最適化などの操作を順番に実行し、最終的にクエリ実行プランを生成します。select のクエリ実行プランは Explain select を通じて確認できます。
3. MySQL サーバーのクエリ実行エンジンはストレージ エンジンを呼び出し、クエリ実行プランに基づいてデータをクエリします。 SQL ステートメントの関連付けの最後のレベルが実行されると、クエリ結果セットが生成されます
4. クエリ結果セットはクライアントに送信され、それを返す方法は 2 つあります。MySQL サーバーは結果セットをキャッシュするか、キャッシュしません。これはパラメータ SQL_BUFFER_RESULT によって設定されます。 また、ユーザーが SQL_CACHE を設定すると、このクエリの結果セットのコピーがクエリ キャッシュに保存されます (手順 1 に関連)。
SQL_CACHE パラメータの啓発:
複雑な複数の結合クエリを複数の単純なクエリに分割します。理由は
2) 複雑なクエリ結果のキャッシュは、関連付けられているテーブルが多すぎるため、失敗する傾向があります)
3) 単純なクエリのロック保持率が低い
My
SQL ServerからPHP層 通信モード MySQL Server
は、「半二重通信」を使用してクライアントと通信します。これは、クライアントとサーバーの一方のみが読み取り可能で、もう一方は書き込みでなければならないことを意味します。利点: プロトコルはシンプルで、クライアントとサーバーの書き込み権限は相互に排他的です
欠点:フロー
は制御できません。一方の端がメッセージの送信を開始し、もう一方の端がメッセージに応答する前にメッセージを完全に受け入れる必要があります。啓発: サーバークエリがクライアントに送信された後の結果セット、およびクライアントのクエリエンジン (mysqlnd など) はそれを完全に受け入れる必要があります。したがって、数行だけが必要な場合は、SQL ステートメントに制限を追加し、select * の使用は控えめにしてください。
結果セット返却モード 結果セット返却では、レコードの各行がクライアント/サーバー通信プロトコルを通じてパッケージ化され、その後、当然ながら TCP 層で、各行のプロトコル パッケージに渡されます。レコードが最初にキャッシュされるため、大きなパケットの構成は、送信時にアプリケーション層に透過的に認識されます。MySQL サーバーは、すべての結果セットをクライアントに送信した後でのみ、結果セットによって占有されているバッファを解放できます。
サーバーキャッシュモード
クライアント コマンド: mysql_unbuffer_query()、結果セット キャッシュはクライアントの SQL ドライバー拡張機能 mysqlnd に設定されていないため、feth_array_xxx が結果セットからレコードを読み取るときは、サーバーのバッファーから読み取る必要があります。
サーバー側にキャッシュモードはありません
クライアント コマンド: mysql_query()、サーバーの結果セットをキャッシュするためにバッファーがクライアントの SQL ドライバー拡張機能 (mysqlnd) に設定されるため、feth_array_xxx が結果セットからレコードを読み取るとき、そのレコードは mysqlnd 拡張バッファー行から直接取得されます。
概要
結果セットが大きい場合: サーバー側のキャッシュフリー モードはサーバーのメモリ負荷を軽減できますが、クライアントのメモリを占有します。それは状況次第です。
PHP層からユーザー層へ
クライアント側では、サーバー側に接続されているのは mysql 拡張エンジン libmysql または mysqlnd)、ユーザー層は拡張ライブラリ ext/mysql または ext/mysqli を通じて mysql エンジンと対話します (インスピレーションは次の呼び出しです)結果セットを読み取るためのエンジンの API)。
エンジン libmysql と mysqlnd のメカニズムは異なります。主な違いは、mysqlnd が PHP で記述され、zend にコンパイルされることです。また、libmysql は一般的なライブラリであり、zend はデータベース接続を実現するためにこのライブラリを呼び出す必要があります。この違いにより、mysqlnd と zend の密着性が向上し、データがユーザー層に送信されるときにデータ コピーの層が 1 つ少なくなります。具体的なアーキテクチャの違いを次の図に示します。図では、五芒星はキャッシュ バッファーを表します。
ext/mysqli と ext/mysql はクライアント拡張ライブラリ (ライブラリ関数) です。クライアント スクリプト レベルでは、mysqlInd と libmysql は MySQL Server 側の ドライバー です。その中で、libmysql はユニバーサル MySQL クエリドライバー であり、mysqlnd は PHP 用に特別に設定された Zend エンジンベースの SQL ドライバーです。つまり、mysqlnd のデータ駆動型アクションは Zend と mysqlserver と対話する必要があるのに対し、libmysql はです。 my sqlserverinteractive と直接対話します。
ext/mysqli または ext/mysql) および libmysql データベース クエリ プロセスは次のとおりです:
1) mysqi は libmysql ドライバーにクエリリクエストを送信します
2) Libmysql はリクエストを実行し、ストレージ ドメイン libmysql のバッファに結果セットを取得します
3) Mysqli はメモリに適用されます: zval で指定されたバッファー
4) Mysqii は、結果セットを libmysql から zval で指定されたバッファーにコピーします
ext/mysqli または ext/mysql) および mysqlnd データベース クエリ プロセスは次のとおりです:
1) mysqi は mysqlnd ドライバーにクエリリクエストを送信します
2) mysqlnd ドライバーは、zend エンジンを通じて SQL クエリを実行し、結果セットの各行はバッファーに分散されます。
3) Mysqlnd は複数の zval を作成し、これらのバッファーを指します
例:
ext/mysqli および mysqlInd では、mysqlnd ドライバーは SQL ステートメントを実行して結果セット Row1 ~ Row3 を取得します。各行は zend のバッファーによって直接保存され、zval によってポイントされます。クライアントは、マッピングを通じてこのメモリ領域から結果を直接読み取り、mysqli_fetch_xxx を実装します。
mysqlnd と zend はより一貫性があります。SQL クエリ ドライバーでは、mysqlnd は zend エンジンを介してデータベースにアクセスし、結果を zend のバッファーに直接保存します (zend から独立しています)。結果が少なくなります キャッシュされたコピーを設定します。
参考
《高性能MySQL》 http://www.cnxct.com/libmysql-mysqlnd-what-is-best-and-what-about-mysqli-pdomysql-mysql/
http://www.cnxct.com/wp-content/uploads/2012/12/andrey-mysqlnd.pdf
著作権声明: この記事はブロガー http://blog.csdn.net/ordereder) によるオリジナルの記事であり、ブロガーの許可なく複製することはできません。
上記では、関連する側面を含め、PHP から MySQL へのデータ クエリ プロセスの概要を紹介しました。MySql に興味のある友人に役立つことを願っています。
コンピューター/携帯電話に関するヒント:
共有ドキュメントをキャンセルする
デフォルトでは、Windows XP でマイ コンピュータを開くと、ハード ドライブ アイコンの上にいくつかのフォルダが表示されます。これらは「共有フォルダー」であり、ユーザーがファイルを共有するために使用する各フォルダーを次に示します。これらのフォルダーをコンピューターから削除する方法は非常に簡単です。レジストリを開いて、HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindows CurrentVersion ExplorerMyComputerNameSpaceDelegateFolders キーの値を削除します。 . コンピューターでは、これらの迷惑なフォルダーはもう存在しません。