PHP は、MySQL の大量データのメモリ使用量を分析およびクエリします。
この記事では主に、PHP で MySQL にクエリを実行して原理、マニュアル、ソース コード分析から多数の結果を返すときのメモリ使用量の問題について説明します。また、MySQL C API の使用についても説明します。
昨日、同僚が PHP ディスカッション グループ (276167802 検証: csl、興味があれば参加して一緒に議論できます) で、彼が取り組んでいたプロジェクトが多すぎる結果 (最大 100,000) を返したと述べました。 MySQL クエリの結果、PHP メモリが不足しました。そこで、返された MySQL の結果を反復処理する前に、データがすでにメモリ内にあるのではないかと彼は尋ねました。
[php]
while ($row = mysql_fetch_assoc($result)) {
// ...
}
もちろん、この問題には多くの最適化方法がありますが、この問題に関する限り、私が最初に思いつくのは、MySQL が古典的な C/S (クライアント/サーバー、クライアント/サーバー) モデルであるということです。結果セットを走査する前に、基盤となる実装がネットワーク経由ですべてのデータをクライアントのバッファに読み取っている可能性があります (TCP/IP が使用されていると仮定します)。別の可能性としては、データがまだサーバー側の送信バッファ内にある可能性があります。クライアントに渡されていません。
PHP と MySQL のソース コードを見る前に、PHP マニュアルに同様の機能を持つ 2 つの関数があることに気付きました。
[php]
mysql_query()
mysql_unbuffered_query()
2 つの関数の文字通りの意味と説明により、前者の関数が実行されると、すべての結果セットがサーバーからクライアントのバッファーに読み取られますが、後者の関数は読み取られません。 unbuffered(アンバッファード)」という意味です。
つまり、mysql_unbuffered_query() を使用して大きな結果セットを返す SQL ステートメントを実行する場合、結果を走査する前に PHP のメモリが結果セットによって占有されることはありません。また、mysql_query() を使用して結果セットを実行する場合も同様です。同じステートメントでも、関数が返されると、PHP のメモリ使用量が急激に増加し、すぐにすべてのメモリが消費されます。
PHP の関連コードを読むと、これら 2 つの関数の実装の類似点と相違点がわかります。
[php]
/* {{{ proto resource mysql_query(string query [, int link_identifier])
SQL クエリを MySQL に送信します */
PHP_FUNCTION(mysql_query)
{
php_mysql_do_query(INTERNAL_FUNCTION_PARAM_PASSTHRU, MYSQL_STORE_RESULT);
}
/* }}} */
/* {{{ proto resource mysql_unbuffered_query(string query [, int link_identifier])
結果行のフェッチやバッファリングを行わずに、SQL クエリを MySQL に送信します */
PHP_FUNCTION(mysql_unbuffered_query)
{
php_mysql_do_query(INTERNAL_FUNCTION_PARAM_PASSTHRU, MYSQL_USE_RESULT);
}/* }}} */
どちらの関数も php_mysql_do_query() を呼び出しますが、唯一の違いは 2 番目のパラメーター MYSQL_STORE_RESULT と MYSQL_USE_RESULT です。php_mysql_do_query() の実装を見てみましょう。
[php]
if(use_store == MYSQL_USE_RESULT) {
mysql_result=mysql_use_result(&mysql->conn);
} else {
mysql_result=mysql_store_result(&mysql->conn);
}
mysql_use_result() と mysql_store_result() は MySQL の C API 関数です。これら 2 つの C API 関数の違いは、後者は結果セット全体を MySQL サーバーからクライアントに読み取るのに対し、前者は結果セットのみを読み取ることです。メタ情報。
PHP に戻り、mysql_unbuffered_query() を使用して、即時のメモリ占有を回避します。結果がトラバーサル プロセス中に「PHP キャッシュ」されない場合 (配列に配置する場合など)、実行プロセス全体が 100 個で動作します。数千項目、または数百万以上のデータがありますが、PHP が占有するメモリは常に非常に小さいです。
この記事が大多数の PHP 開発者にとって役立つことを願っています。この記事を読んでいただきありがとうございます。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック









PHPの将来は、新しいテクノロジーの傾向に適応し、革新的な機能を導入することで達成されます。1)クラウドコンピューティング、コンテナ化、マイクロサービスアーキテクチャに適応し、DockerとKubernetesをサポートします。 2)パフォーマンスとデータ処理の効率を改善するために、JITコンパイラと列挙タイプを導入します。 3)パフォーマンスを継続的に最適化し、ベストプラクティスを促進します。

MySQLは、オープンソースのリレーショナルデータベース管理システムです。 1)データベースとテーブルの作成:createdatabaseおよびcreateTableコマンドを使用します。 2)基本操作:挿入、更新、削除、選択。 3)高度な操作:参加、サブクエリ、トランザクション処理。 4)デバッグスキル:構文、データ型、およびアクセス許可を確認します。 5)最適化の提案:インデックスを使用し、選択*を避け、トランザクションを使用します。

PHP and Python each have their own advantages, and the choice should be based on project requirements. 1.PHPは、シンプルな構文と高い実行効率を備えたWeb開発に適しています。 2。Pythonは、簡潔な構文とリッチライブラリを備えたデータサイエンスと機械学習に適しています。

次の手順でphpmyadminを開くことができます。1。ウェブサイトコントロールパネルにログインします。 2。phpmyadminアイコンを見つけてクリックします。 3。MySQL資格情報を入力します。 4.「ログイン」をクリックします。

MySQLとSQLは、開発者にとって不可欠なスキルです。 1.MYSQLはオープンソースのリレーショナルデータベース管理システムであり、SQLはデータベースの管理と操作に使用される標準言語です。 2.MYSQLは、効率的なデータストレージと検索機能を介して複数のストレージエンジンをサポートし、SQLは簡単なステートメントを通じて複雑なデータ操作を完了します。 3.使用の例には、条件によるフィルタリングやソートなどの基本的なクエリと高度なクエリが含まれます。 4.一般的なエラーには、SQLステートメントをチェックして説明コマンドを使用することで最適化できる構文エラーとパフォーマンスの問題が含まれます。 5.パフォーマンス最適化手法には、インデックスの使用、フルテーブルスキャンの回避、参加操作の最適化、コードの読み取り可能性の向上が含まれます。

PHPは死にかけていませんが、常に適応して進化しています。 1)PHPは、1994年以来、新しいテクノロジーの傾向に適応するために複数のバージョンの反復を受けています。 2)現在、電子商取引、コンテンツ管理システム、その他の分野で広く使用されています。 3)PHP8は、パフォーマンスと近代化を改善するために、JITコンパイラおよびその他の機能を導入します。 4)Opcacheを使用してPSR-12標準に従って、パフォーマンスとコードの品質を最適化します。

Redisは、単一のスレッドアーキテクチャを使用して、高性能、シンプルさ、一貫性を提供します。 I/Oマルチプレックス、イベントループ、ノンブロッキングI/O、共有メモリを使用して同時性を向上させますが、並行性の制限、単一の障害、および書き込み集約型のワークロードには適していません。

MySQLはオープンソースのリレーショナルデータベース管理システムであり、主にデータを迅速かつ確実に保存および取得するために使用されます。その実用的な原則には、クライアントリクエスト、クエリ解像度、クエリの実行、返品結果が含まれます。使用法の例には、テーブルの作成、データの挿入とクエリ、および参加操作などの高度な機能が含まれます。一般的なエラーには、SQL構文、データ型、およびアクセス許可、および最適化の提案には、インデックスの使用、最適化されたクエリ、およびテーブルの分割が含まれます。
