PostgreSQL の発見の旅

Jan 17, 2024 am 08:15 AM
linux Linuxチュートリアル レッドハット Linuxシステム Linuxコマンド Linux 認定 レッドハットリナックス Linuxビデオ

PostgreSQL の発見の旅

Postgres にはいくつかのインデックス タイプがあり、新しいバージョンごとにいくつかの新しいインデックス タイプが追加されるようです。各インデックス タイプは便利ですが、どのタイプを使用するかは、(1) データのタイプ、場合によっては (2) テーブル内の基になるデータ、および (3) 実行される検索のタイプ​​によって決まります。次のコンテンツでは、Postgres で使用できるインデックスの種類と、どのような場合にどのインデックスの種類を使用する必要があるかを紹介します。始める前に、ここで説明するインデックス タイプのリストを示します:

Bツリー
一般化転置インデックス (GIN)
一般化反転検索ツリー (GiST)
スペース分割された GiST (SP-GiST)
ブロック範囲インデックス (BRIN)
ハッシュ### それではインデックス作成から始めましょう。

Postgres では、B ツリー インデックスが最も一般的に使用されるインデックスです コンピューター サイエンスの学位を取得している場合は、B ツリー インデックス作成が最初に学習するインデックスになる可能性があります。 B ツリー インデックスは、常にバランスを維持するツリーを作成します。インデックスに基づいて何かを検索する場合、ツリーをたどってキーを見つけ、探しているデータを返します。インデックスを使用すると、数千のレコードを順次スキャンするのではなく、数ページを読み取るだけで済むため (少数のレコードのみを返す場合)、順次スキャンよりも大幅に高速になります。

標準の CREATE INDEX ステートメントを実行すると、B ツリー インデックスが作成されます。 B ツリー インデックスは、テキスト、数値、タイムスタンプなど、ほとんどのデータ型で役立ちます。データベースでインデックスを使い始めたばかりで、データベースで Postgres の高度な機能をあまり使用していない場合は、標準の B ツリー インデックスを使用するのがおそらく最良の選択肢です。

複数値列の GIN インデックス 汎用逆索引 (一般に GIN と呼ばれます) は、単一の列に複数の値が含まれるデータ型に最も適しています。

Postgres ドキュメントによると:

"GIN は、インデックス付けされているエントリが複合値であり、インデックスによって処理されるクエリが複合エントリ内で発生する値を検索する必要がある状況を処理するように設計されています。たとえば、このエントリはドキュメントである可能性があります。 、クエリはドキュメントに含まれる値を検索できます。文字を指定してください。"

この範囲に含まれる最も一般的なデータ型は次のとおりです:

hストア

配列### 範囲### JSONB
GIN インデックスで最も満足できる点の 1 つは、複合値に格納されたデータを理解できることです。ただし、GIN インデックスには追加される個々の型のデータ構造に関する特定の知識が必要であるため、すべてのデータ型が GIN インデックスでサポートされているわけではありません。

GiST インデックス、値が重複する行の場合

Generalized Inverted Search Tree (GiST) インデックスは、データが同じ列内の他のデータ行と重複している場合に最も適しています。 GiST インデックスの最適な使用方法は、ジオメトリ データ型を宣言し、2 つのポリゴンにいくつかの点が含まれているかどうかを知りたい場合です。ある場合には、特定の点がボックス内に含まれる一方で、他の点は多角形内にのみ存在することがあります。 GiST を使用してインデックス付けされる一般的なデータ型は次のとおりです: ジオメトリ タイプ

全文検索が必要なテキスト タイプ

GiST インデックスのサイズには多くの固定制限があり、そうしないと、GiST インデックスが非常に大きくなる可能性があります。その代償として、GiST インデックスには損失が生じます (不正確)。


公式ドキュメントによると:

"GiST インデックスには損失があり、インデックスが誤った一致を生成する可能性があることを意味します。そのため、実際のテーブルの行をチェックして誤った一致を排除する必要があります。(PostgreSQL は必要に応じてこのアクションを自動的に実行します)"

これは、誤った結果が得られるという意味ではなく、Postgres がデータを返す前にこれらの誤った結果をフィルタリングするための小さな追加作業を行うことを意味します。

特記事項: GIN インデックスと GiST インデックスは、多くの場合、同じデータ型で使用できます。通常、パフォーマンスは優れていますが、多くのディスク領域を占有し、その逆も同様です。 GIN と GiST に関しては、あらゆる状況で機能する万能のソリューションはありませんが、上記のルールはほとんどの一般的な状況に適用されるはずです。

大規模データ用のSP-GiSTインデックス

空間分割 GiST (SP-GiST) インデックスは、Purdue Research の空間分割ツリーを採用しています。 SP-GiST インデックスは、データに自然なクラスタリング要素があり、バランスの取れたツリーではない場合によく使用されます。電話番号はその良い例です (少なくとも米国の電話番号はそうです)。形式は次のとおりです:

3桁の市外局番
3 桁のプレフィックス番号 (古い電話交換機に関連)
4桁の回線番号
これは、最初のセットの最初の 3 桁に自然なクラスタリング係数があり、次に 2 番目の 3 桁セットが続き、数値が均等に分散されることを意味します。ただし、電話番号の一部の市外局番では、他の局番よりも飽和状態が高くなります。その結果、非常にバランスの悪いツリーが作成される可能性があります。フロントには自然な集約要素があり、データは均等に分散されていないため、電話番号などのデータは SP-GiST に適している可能性があります。

BRIN インデックス、より大きなデータ用

ブロック範囲インデックス (BRIN) は、SP-GiST などのいくつかの状況に焦点を当てており、データに自然な順序があり、データ量が多くの場合に大きい場合に最適です。時系列順に 10 億件のレコードがある場合、BRIN が役立つ可能性があります。複数の郵便番号など、自然にグループ化された大規模なデータ セットをクエリする場合、BRIN を使用すると、同様の郵便番号がディスク上の近い場所に保存されるようにすることができます。

日付または郵便番号でソートされた非常に大規模なデータベースがある場合、BRIN インデックスを使用すると、一部の不要なデータを非常に迅速にスキップまたは除外できます。さらに、BRIN インデックスは全体のデータ サイズに比べて比較的小さいため、大規模なデータ セットがある場合は BRIN インデックスの方がパフォーマンスが向上します。

ハッシュインデックス、ついにクラッシュの心配がなくなる

ハッシュ インデックスは Postgres に長年存在していましたが、Postgres 10 がリリースされるまでは、その使用について大きな注意事項があり、WAL に記録されませんでした。つまり、サーバーがクラッシュし、スタンバイにフェイルオーバーできないか、wal-g などを使用してアーカイブから復元できない場合、インデックスを再構築するまでそのインデックスは失われます。 Postgres 10 のリリースにより、これらは WAL に記録されるようになったので、再び使用することを検討するかもしれませんが、本当の問題は、使用すべきかどうかです。

ハッシュ インデックスは、B ツリー インデックスよりも高速な検索を提供する場合があり、作成も高速です。最大の問題は、これらの比較演算が「等価」比較演算のみに制限されているため、完全一致検索にしか使用できないことです。このため、ハッシュ インデックスは一般的に使用される B ツリー インデックスよりも柔軟性が大幅に低くなり、代替品としてではなく、特殊な場合のインデックスとして考える必要があります。

どれを使うべきですか?

ここまでたくさん紹介してきましたが、少し怖がっていてもそれは正常です。これを事前に知っていれば、CREATE INDEX は常に B-Tree を使用してインデックスを作成します。幸いなことに、Postgres はほとんどのデータベースで非常に優れたパフォーマンスを発揮します。 :) さらに Postgres 機能の使用を検討している場合は、他の Postgres インデックス タイプを使用する場合のチートシートを以下に示します:

B ツリー - ほとんどのデータ型とクエリに適しています
GIN - JSONB/hstore/arrays 用
GiST - 全文検索と幾何学的データ型に適しています
SP-GiST - 自然な集計要素はあるものの、不均一に分散している大規模なデータ セットに適しています
BRIN - シーケンシャルな順序を持つ非常に大規模なデータセットに適しています
ハッシュ - 等価演算には適していますが、通常は B ツリー インデックスだけで十分です。
この記事に関してご質問やフィードバックがございましたら、お気軽に Slack チャンネルにご参加ください。

以上がPostgreSQL の発見の旅の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

rootとしてmysqlにログインできません rootとしてmysqlにログインできません Apr 08, 2025 pm 04:54 PM

ルートとしてMySQLにログインできない主な理由は、許可の問題、構成ファイルエラー、一貫性のないパスワード、ソケットファイルの問題、またはファイアウォール傍受です。解決策には、構成ファイルのBind-Addressパラメーターが正しく構成されているかどうかを確認します。ルートユーザー許可が変更されているか削除されてリセットされているかを確認します。ケースや特殊文字を含むパスワードが正確であることを確認します。ソケットファイルの許可設定とパスを確認します。ファイアウォールがMySQLサーバーへの接続をブロックすることを確認します。

c言語条件付き編集:初心者向けの詳細なガイドへの実践的なアプリケーション c言語条件付き編集:初心者向けの詳細なガイドへの実践的なアプリケーション Apr 04, 2025 am 10:48 AM

c言語条件付きコンパイルは、コンパイル時間条件に基づいてコードブロックを選択的にコンパイルするメカニズムです。導入方法には、#IFおよび#ELSEディレクティブを使用して、条件に基づいてコードブロックを選択します。一般的に使用される条件付き式には、STDC、_WIN32、Linuxが含まれます。実用的なケース:オペレーティングシステムに従って異なるメッセージを印刷します。システムの数字数に応じて異なるデータ型を使用します。コンパイラに応じて、異なるヘッダーファイルがサポートされています。条件付きコンパイルにより、コードの移植性と柔軟性が向上し、コンパイラ、オペレーティングシステム、CPUアーキテクチャの変更に適応できます。

Linuxの5つの基本コンポーネントは何ですか? Linuxの5つの基本コンポーネントは何ですか? Apr 06, 2025 am 12:05 AM

Linuxの5つの基本コンポーネントは次のとおりです。1。カーネル、ハードウェアリソースの管理。 2。機能とサービスを提供するシステムライブラリ。 3.シェル、ユーザーがシステムと対話するインターフェイス。 4.ファイルシステム、データの保存と整理。 5。アプリケーション、システムリソースを使用して機能を実装します。

特定のシステムバージョンでMySQLが報告したエラーのソリューション 特定のシステムバージョンでMySQLが報告したエラーのソリューション Apr 08, 2025 am 11:54 AM

MySQLのインストールエラーのソリューションは次のとおりです。1。システム環境を慎重に確認して、MySQL依存関係ライブラリの要件が満たされていることを確認します。異なるオペレーティングシステムとバージョンの要件は異なります。 2.エラーメッセージを慎重に読み取り、依存関係のインストールやSUDOコマンドの使用など、プロンプト(ライブラリファイルの欠落やアクセス許可など)に従って対応する測定値を取得します。 3.必要に応じて、ソースコードをインストールし、コンパイルログを慎重に確認してみてください。これには、一定量のLinuxの知識と経験が必要です。最終的に問題を解決する鍵は、システム環境とエラー情報を慎重に確認し、公式の文書を参照することです。

MySQLを解決する方法は開始できません MySQLを解決する方法は開始できません Apr 08, 2025 pm 02:21 PM

MySQLの起動が失敗する理由はたくさんあり、エラーログをチェックすることで診断できます。一般的な原因には、ポートの競合(ポート占有率をチェックして構成の変更)、許可の問題(ユーザー許可を実行するサービスを確認)、構成ファイルエラー(パラメーター設定のチェック)、データディレクトリの破損(テーブルスペースの復元)、INNODBテーブルスペースの問題(IBDATA1ファイルのチェック)、プラグインロード障害(エラーログのチェック)が含まれます。問題を解決するときは、エラーログに基づいてそれらを分析し、問題の根本原因を見つけ、問題を防ぐために定期的にデータをバックアップする習慣を開発する必要があります。

MySQLはAndroidで実行できますか MySQLはAndroidで実行できますか Apr 08, 2025 pm 05:03 PM

MySQLはAndroidで直接実行できませんが、次の方法を使用して間接的に実装できます。Androidシステムに構築されたLightWeight Database SQLiteを使用して、別のサーバーを必要とせず、モバイルデバイスアプリケーションに非常に適したリソース使用量が少ない。 MySQLサーバーにリモートで接続し、データの読み取りと書き込みのためにネットワークを介してリモートサーバー上のMySQLデータベースに接続しますが、強力なネットワーク依存関係、セキュリティの問題、サーバーコストなどの短所があります。

MySQLはダウンロード後にインストールできません MySQLはダウンロード後にインストールできません Apr 08, 2025 am 11:24 AM

MySQLのインストール障害の主な理由は次のとおりです。1。許可の問題、管理者として実行するか、SUDOコマンドを使用する必要があります。 2。依存関係が欠落しており、関連する開発パッケージをインストールする必要があります。 3.ポート競合では、ポート3306を占めるプログラムを閉じるか、構成ファイルを変更する必要があります。 4.インストールパッケージが破損しているため、整合性をダウンロードして検証する必要があります。 5.環境変数は誤って構成されており、環境変数はオペレーティングシステムに従って正しく構成する必要があります。これらの問題を解決し、各ステップを慎重に確認して、MySQLを正常にインストールします。

ターミナルからMySQLにアクセスできません ターミナルからMySQLにアクセスできません Apr 08, 2025 pm 04:57 PM

端末からmysqlにアクセスできない場合は、次の理由があります。MySQLサービスが実行されていません。接続コマンドエラー;許可が不十分です。ファイアウォールは接続をブロックします。 mysql構成ファイルエラー。

See all articles