0

非常に一般的なデータ ストレージを提供する 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はありますか? できれば無料のもの。

4

1 に答える 1

3

まず、画像ファイルをデータベースに保存する場合と場所があると思いますが、一般的に、この種の操作に関連して余分な I/O とメモリが必要になります。これを最適化する場合は、すべての画像にパスを付けて、これらを fs に一括保存できます。このようにして、それらはバックアップ目的でデータベースに残りますが、相対パスを引き出してリンクを生成するだけで、一連のSQLクエリを節約し、オーバーヘッドを削減できます. Web ベースのバックエンドでは、HTML の生成と画像の取得の間でトランザクションをうまく機能させることはできません。これらは異なる HTTP リクエストの下で行われるからです。

速度に関しては、合計の http 要求時間を見ているのか、db 時間を見ているのかわかりません。しかし、最初に行う必要があるのは、すべてをバラバラにして、最も多くの時間を費やしている場所を探すことです。これはあなたを驚かせるかもしれません。次に、遅いクエリであるクエリのクエリ プランを取得します。

http://heatware.net/databases/how-to-find-log-slow-queries-postgresql/

そこから、Explain Analyst を使用して問題の原因を突き止めます。

また、ハードウェアのアップグレードを決定する際には、現在限界に直面している場所をよく理解しておく必要があります。RAM を増やすと一般的に役立ちます (データベースが RAM に快適に収まる場合に役立ちます)。しかし、それ以上は、CPU バウンド サーバーに高速ストレージを配置したり、I/O バウンドで高速 CPU を備えたサーバーに切り替えたりしても意味がありません。サーバ。上はあなたの友達です。同様に、同時実行の問題によっては、select ステートメントにホット スタンバイを使用することが理にかなっている場合もあります (ない場合もあります)。

しかし、さらに多くの情報がなければ、データベースをさらに最適化するための最良の方法が何であるかを伝えることはできません. PostgreSQL は、適切な条件下で非常に高速に実行でき、非常にうまくスケーリングできます。

于 2012-08-30T00:42:39.473 に答える