私は、php と mysql に基づく 1 つの巨大なソフトウェアのパフォーマンスを最適化しようとしています。Apache のキャッシングと MySQL のインデックスを試しましたが、十分ではありません。このソフトウェア内のすべてのフォームは、データベースの構成から動的に構築および印刷されるため、ソフトウェアは膨大な数の SQL を送信し、多くの同時接続ユーザー (平均で 200 ~ 300) が接続されている場合、全体を遅くする多くの結合を行います。
コードに触れることはできないため、アプリケーション サーバーとデータベース サーバーの間にmysql-proxyを配置し、そこでクエリ結果をキャッシュして、 lua経由でredisまたはmemchachedにアクセスできることを確認しました。私の考えは、すべてをキャッシュすることです。ただし、問題はキャッシュを無効にすることです。レコードが更新されたら、キャッシュされたすべての結果セットを無効にするにはどうすればよいですか?
アイデアの 1 つは、SQL クエリを md5 に変換し、結果をセットのキーとして格納することでした。ただし、クエリの分析も行い、同じ md5 キーとテーブルへの参照を保存します。例えば:
クエリ:
select * from products left join users on products.user_id = user.id
キャッシュ インスタンス A
3b98ab273f45af78849db563df6598d1– {result set}
キャッシュ インスタンス B
products - 3b98ab273f45af78849db563df6598d1
users - 3b98ab273f45af78849db563df6598d1
したがって、UPDATE、INSERT、または DELETE がこれらのテーブルに対して発行されると、特定のテーブルがクエリされたすべての結果セットが無効になります。
私はそれを使ってかなり多くの作業を行っており、これを達成するためのより簡単な方法があるかどうか疑問に思っていました.