重いトラフィックのためのPostgresクエリとサーバーの最適化
4069 ワード
psqlクエリを最適化しましょう!
インデックス
PostgreSQLはすべての主キーのインデックスを自動的に作成しますが、自動的に索引付けされた外部キーですか?いや!任意の外部キーターゲット列のインデックスを明示的に作成する必要があります.これは特にInnerJoinsとの問合わせをしていて、テーブルの中で異なる関係を参照したいときに特に便利です.
デフォルトでは、Postgresは、Bツリーインデックス、またはバイナリツリーインデクシングを使用します.実行時間の削減実行時間の劇的な低下が見られるでしょう.
レコード、または行のより小さい数を扱う場合、シーケンシャルルックアップは罰金かもしれません.しかし、想像して、1000万のレコードのテーブル.レコード番号99999の逐次検索は、レコード番号1の検索よりずっと長くなりますB - treeインデックスはメモリ使用量が重くなります.それで、不必要なインデックスを避けてください.インデックスは、実際に必要なターゲットのみ.
あなたのデータが範囲で組織化されることができるならば、おそらく考慮するオプションはあなたの記録で異なる範囲を分けるためにBinインデックスを使用することです.比較によって、ブリンインデックスはかなり少ないメモリを必要とします.
解析を使用し、クエリをテストします
クエリーステートメントの前に説明解析を入力することで、クエリ実行時間を見てみると、適切なインデックスを使用するときに実行時間の減少を簡単に見ることができます.
それを試してみてください!クエリを書き、レコードの前、中央、および末尾のレコードを使って準備と実行時間の違いを確認するには、LimenAnalysisを使用します.どのようにクエリを実行するのですか?
PGRIGHT STATHERNステートメントは、平均値、中央値、最小値、最大値、およびクエリの他のメトリックを参照できるPostgresの機能が組み込まれています.これは特に準備された文を実行するとき、強力で役に立つツールです.PGSUNE STATを使用可能にするには、Postgres設定ファイルにあるShareCount PreloadResライブラリに追加する必要があります.以下に設定について説明します.
- config形式のファイルを見つけるには、次のように入力します.
psql -U username(usually defaulted to postgres)
-c 'SHOW config_file'
- ConfigCoreファイル( PostgreSQL . conf )を開き、"ShareddPreloadResライブラリ"を探します.以下のガイドに従ってください.これらの変更はpsqlの再起動を必要とします.shared_preload_libraries = 'pg_stat_statements'
pg_stat_statements.max = 10000
pg_stat_statements.track = all
shared_preload_libraries = 'auto_explain'
auto_explain.log_min_duration = 0
auto_explain.log_analyze = on
クエリ文の最適化
不要な内部結合を避ける.結合を使用してクエリを書く比較し、その後?どのように実行時間を比較しますか?
具体的であれ.のみを選択するか、実際に必要なデータを取得する*.最愛の選択*は素晴らしいとすべてですが、あなたの要求でより具体的にすることができれば、それは長期的にメモリを保存します.
何がクエリプランですか?
クエリプランは、一連の手順またはデータを取得するために実行されるデータベースによって作られた計画です.クエリは、新しいクエリが実行されるたびに準備されます.LINE Analysisを使用すると、クエリプランは準備と実行時間とともに印刷されます.
クエリ計画は、どのように多くの行が横断されたか、どのようなスキャンが実行されているか(インデックスまたはシーケンシャル)、どのように多くの労働者が計画され、起動されたか、実行時と一緒に使用されるループまたは入れ子になったループの種類を示します.
プリペアドステートメント!
準備された文を作成することができますので、最初のクエリの後、すべての連続した後の準備時間を費やすだけで、すでに既存のクエリ計画を実行するに焦点を当てます.プリペアドステートメントを作成するのは、反復されることを知るクエリに便利です.Postgresはクエリ文字列を読み込むだけで、最初の実行で一つの問い合わせ計画を作成しなければなりません.
PostgreSQLのドキュメントから取得したプリペアドステートメントの例を示します.
PREPARE fooplan (int, text, bool, numeric) AS
INSERT INTO foo VALUES($1, $2, $3, $4);
EXECUTE fooplan(1, 'Hunter Valley', 't', 200.00);
EXECUTE fooplan(2, 'Death Valley', 'f', 600.00);
その中で「プランプラン」という案が作られる.FooPlanには、選択されたデータ型に制限されたパラメーターがあります.dollarsign + integerは、それらの引数を表す変数名として使用されます.プリペアドステートメントFooPlanを使用するには、Word ExecuteとPlan Nameを使用し、Parensに引数を入力します.あなたのCPUを利用してください.
どのように多くのコアあなたのマシンを持っていますか?たぶん、あなたはトースターの上でデータベースサーバーを実行しています.マイクロインスタンス.あなたの最愛のマシンのみ1コアがあります.あなたが多分より多くのコアを持っているならば、あなたはおそらくhahaをします、あなたは最大の労働者の数を設定することによって、並列質問を利用することができます.これにより、複数のクエリを異なるコアで同時に実行することができます.ウッ!
あなたの接続を管理してください.
どのように多くの同時接続のデータベースサーバーにはありますか?AKAは、どのように多くのユーザーが同時にあなたのデータベースサーバへの接続を行うことを要求を作るでしょうか?
PostgreSQLは、接続によって消費される接続とリソースの数を制限するためにMaxCount接続設定を使用します.デフォルトは典型的に100の接続ですが、より多くの並行したユーザのためにこの数を増やすことを考慮したいかもしれません.トラフィックが重くなると、ネットワーク接続を引き起こすことが少ない.
Reference
この問題について(重いトラフィックのためのPostgresクエリとサーバーの最適化), 我々は、より多くの情報をここで見つけました https://dev.to/lydzb123/optimizing-your-postgres-queries-and-server-for-heavy-traffic-1ok1テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol