非常に一般的なデータ ストレージを提供する Web サイトを開発しました。現在は問題なく動作していますが、速度を最適化することを考えています。
INSERT/SELECT の比率は予測が難しく、さまざまなケースで変化しますが、通常は SELECT の方が頻繁に使用されます。INSERT は十分に高速です。SELECTは私が心配しているものです。多くのLEFT JOINがあります。たとえば、各オブジェクトは、(複数のオブジェクトにまたがることができるため) 個別のテーブルに格納された画像を持つことができ、画像に関する追加情報も格納できます。
選択ごとに最大 8 つの結合が行われ、処理に最大 1 秒かかる場合があります。平均値は約 0.3 秒です。すべてのリクエストに対して、そのような選択が複数存在する可能性があります。SQL側ですでに複数回最適化されており、そこでできることはあまりありません。
DB 用により強力なマシンを購入する以外に、何ができるでしょうか?
ここでも Django はスピードの悪魔ではありませんが、まだいくつかの最適化が残っています。必要に応じて PyPy に切り替えます。DB側では、いくつかのアイデアがありましたが、それらは珍しいようです-実際のシナリオを見つけることができませんでした.
- この部分には、より高速な別のストレージを使用してください。トランザクションが必要であり、一貫性チェックが必要なため、好ましくない場合があります。
- 検索可能なキャッシュ? ここで何か意味がありますか?たとえば、NoSQL などで結合されたすべてのテーブルのフラット コピーを維持します。挿入はより高価になります。いくつかの共通テーブルが変更された場合、NoSQL で複数のレコードを更新する必要があります。メンテも大変。
理にかなっているものはありますか、それともRAMを取得して取得し、rdbmsのキャッシュサイズを増やし、SSDを取得してそのままにしておくことができる最速のものですか。データベース接続のプーリングなどの他の部分の最適化にも重点を置いてください。これらもコストがかかるためです。
使用されているテクノロジ: PostgreSQL 9.1 および Django (python)。
要約する。問題は、すべての SQL 部分 (インデックス、クラスタリングなど) を最適化した後です。結果の静的タイムアウト キャッシュがオプションでない場合 (要求引数が異なり、結果が異なる場合)、さらに最適化するために何ができるでしょうか。
--- 2012 年 8 月 30 日編集---
私たちはすでにスロークエリを毎日チェックしています。これが私たちのボトルネックです。インデックスのみを並べ替えてフィルタリングします。また、これについて明確でなくて申し訳ありません-実際の画像をデータベースに保存しません。ファイルパスだけ。
ここでは、JOIN と ORDER BY がパフォーマンスを低下させています。たとえば、20 000 の結果を吐き出す 1 つの複雑なクエリには 1800 ミリ秒かかります (EXPLAIN ANALYZE を使用)。これは、結合されたテーブルに基づくフィルタリングを一切使用していないことを前提としています。
すべての JOINS をスキップすると、110 ミリ秒に短縮されます。それは正気ではありません...そのため、ある種の検索可能なキャッシュまたはフラット コピーの NoSQL を考えています。
順序付けなしで 60 ミリ秒という素晴らしい結果が得られましたが、PostgreSQL での JOIN のパフォーマンスはどうですか? 私たちにとってより良いことができる別のDBはありますか? できれば無料のもの。