PHP で書かれた e コマース ソフトウェア プロジェクトを継承しました。コードベースを調べていると、コード全体に多くの SQL ステートメントが見つかりました。Product、Category、User、Customer などの多くのクラスがあり、すべてのクラスには多くのデータベース クエリがあります。
この状況をどのように処理すればよいかわからなかったので、1 回のページ訪問の合計クエリ数をカウントすることにしました。MySQL クエリ関数をカプセル化し、カウンターを増やしました。
この結果には少しビックリしました。インデックス ページだけにアクセスするには、1633 (!) 回の MySQL 選択クエリが実行されました。あるカテゴリの製品をリストすると、約 2000 のクエリがトリガーされました。
クエリをテキスト ファイルにパイプして分析しました。90% 以上が、おそらく 1 つまたは 2 つの値の単一選択ステートメントです。では、この混乱を解消するにはどうすればよいでしょうか。あなたのアドバイスは何ですか?MySQL サーバーでキャッシュを有効にしました。ページの読み込みには約 490 ミリ秒かかります。
追加の詳細
たとえば、Product というクラスがあります。このクラス内には、単一の小さな SQL 選択ステートメントが 8 つあります。
製品を表示するためにカテゴリ リストを開くと、元のプログラマは 1 つの select ステートメントを使用して必要な製品のリストを取得し、それぞれの製品オブジェクトを作成しました。
この結果から 20 個の製品が得られたとします。
select id from products where price <= 10;
次に、結果を繰り返し処理し、エントリごとに製品オブジェクトを作成します。
$qresult = query("select id from products where price <= 10");
$products = array();
foreach ($qresult as $prod) {
$products[] = new Product($prod['id']);
}
これだけでも、製品に対して 20 * 8 個の SQL クエリが生成されます。また、同じメソッドが他のクラス (User、Customer、Category など) にも使用されます。
少し前に
さて、数週間または数か月が経過した後、これまでに行った解決策を共有したいと思いました.
ページへのアクセスごとにクエリを 50 以下に削減し、ページの読み込み時間を 400 ミリ秒未満に短縮できました。
とても簡単にできました。ホットスポットを特定し、テーブル キャッシュ クラスを構築しようとしました。この静的クラスにアクセスするたびに、テーブルのコンテンツ全体がメモリに読み込まれ、それ以降の各テーブル リクエストは、静的クラスからメモリから提供されます。非常に汚れていて、それほど良くはありませんが、機能し、高速であり、クエリの合計を減らし、サーバー ハードウェアを節約します。
これまでのようにユーザー数がその比率で増加する限り、ハードウェアもこの問題に直面すると思います。
アプリケーションを別のアプリケーションに置き換える場合は、間違いなくデータベース-クエリ-ナイス ソリューションに向かいます。
皆さんのアドバイスに感謝します