PostgreSQL の簡潔さ、使用法、順方向インデックスと逆インデックス、空間検索、ユーザーとロール

PostgreSQL が使用するもの

  • PostgreSQL は、柔軟な BSD ライセンスに基づいてリリースされた無料のオブジェクト リレーショナル データベース サーバー (ORDBMS) です。
  • PostgreSQL 9.0: 64 ビット Windows システム、非同期ストリーム データ レプリケーション、ホット スタンバイをサポート。
  • 本番環境の主流バージョンは PostgreSQL 12 です

BSD 契約と GPL 契約

BSD プロトコル: ソース コードを自由に使用および変更でき、変更したコードをオープン ソースまたはプロプライエタリ ソフトウェアとしてリリースすることもできます。
GPL契約: ソフトウェアがGPLソフトウェアを使用している場合、そのソフトウェアもオープンソースである必要があり、オープンソースでない場合はGPLソフトウェアを使用できません。MySQL は Oracle によって管理されており、MySQL は GPL を使用します

PostgreSQL と MySQL の比較

  • PG には MySQL よりも多くのインデックス タイプがあります。
  • MySQL のバイナリログベースの論理レプリケーションと比較すると、PG のマスター/スレーブ レプリケーションは物理レプリケーションです。
  • PostgreSQL は完全に無料であり、BSD 契約であり、MySQL は Oracle によって管理される GPL 契約です。
  • PG メイン テーブルはヒープ テーブルに格納され、MySQL は MySQL よりも大きなデータ量をサポートできるインデックス構成テーブルを使用します。
    要約すると、PostgreSQL は厳密なエンタープライズ シナリオに適していますが、MySQL は比較的シンプルなビジネス ロジックとデータの信頼性要件が低いインターネット シナリオ (Google、Facebook、alibaba など) により適しています。

Windows での PostgreSQL のダウンロード

ダウンロードリンク: PostgreSQLのダウンロード

  1. exeファイルをクリックするとポップアップが表示されます
    ここに画像の説明を挿入

  2. インストールパスを変更できます
    ここに画像の説明を挿入

  3. コンポーネントのインストールを選択します。理解できない場合は、すべてのコンポーネントを確認できます。
    ここに画像の説明を挿入

  4. データベースのデータパスを設定します。
    ここに画像の説明を挿入

  5. スーパーユーザーのパスワードを設定する
    ここに画像の説明を挿入

6. ポート番号を設定します (デフォルトを直接使用できます)。
ここに画像の説明を挿入
6. 次の図が表示されるまで直接「次へ」をクリックし、チェックを外します。
ここに画像の説明を挿入

  1. pgAdmin 4を開く
    ここに画像の説明を挿入
  2. 左側で「サーバー」 > 「Postgre SQL 10」をクリックし、
    ここに画像の説明を挿入
    パスワードを入力して「OK」をクリックします。

ここに画像の説明を挿入
9. SQL シェル (psql) を開きます
![ここに図の説明を挿入](https://img-blog.csdnimg.cn/32f8f25a7f8547c7ad463abc4a24db5b.png)
ここに画像の説明を挿入

PostgreSQL リモート アクセス

  1. postgresqlインストールディレクトリのdataサブディレクトリを開きます。
    ここに画像の説明を挿入

  2. pg_hba.conf ファイルを変更します。IPV4 セクションに新しい行を追加します。host all all 0.0.0.0/0 md5
    ここに画像の説明を挿入

  3. [コントロール パネル] –> [システムとセキュリティ] –> [Windows ファイアウォール] でファイアウォールを閉じ、サービスを再起動します。

  • ビジネス開発ではクライアント接続ツールを介してPostgreSQLを操作することが多く、コマンドラインから操作する方法はまだ少なく、私はnavicatを使用しています。
  • リモート アクセス接続の問題にはさまざまな種類が考えられますが、そのほとんどは Baidu で解決できます。

PostgreSQLの基本的な使い方

ログイン

ビジネスでは、ほとんどの場合、navicat を使用して接続し、コマンド ラインを使用して接続することはほとんどありません。

psql -U dbuser -d exampledb -h 127.0.0.1 -p 5432

データベース操作

#创建数据库
CREATE DATABASE mydb;

#查看所有数据库
\l

#切换当前数据库
\c mydb


#删除数据库
drop database <dbname>

データベーステーブルの操作

テーブルのフィールドタイプ

  1. 整数
  • smallint : 2 バイト、狭い範囲の整数、範囲 -32768 ~ +32767
  • 整数: 4 バイト、-2147483648 ~ +2147483647 の範囲の一般的に使用される整数
  • bigint: -9223372036854775808 ~ +9223372036854775807 の範囲の 8 バイトの広範囲の整数
  • 10 進数 : ユーザー指定の可変長精度、小数点の前は 131072 桁、小数点の後は 16383 桁
  • ユーザー指定の可変長数値精度、小数点の前は 131072 桁、小数点の後は 16383 桁
  • double: 8 バイトの変数精度、不正確な 15 桁の 10 進精度

通常、ビジネスでは double は使用されません。精度誤差の問題を避けるために、10 進数を使用することをお勧めします。

  1. 文字タイプ
  • char(size)、character(size): 固定長文字列、size は格納する文字数を指定し、右側はスペースで埋められます。
  • varchar(size)、charactervariing(size): 可変長文字列、size は格納する文字数を指定します。
  • テキスト: 可変長の文字列。
  1. 時間タイプ
  • タイムスタンプ: 日付と時刻。
  • 日付: 日付、時間なし。
  • 時間: 時間;

主にこれらの型のほか、ジオメトリ型、ブール型などがあり、上記の 3 つが一般的です。

テーブル操作

ビジネスでは、テーブルを作成する操作はビジュアル クライアント ツールを使用して作成する必要があります。


#创建表
CREATE TABLE test(id int,body varchar(100));

#在表中插入数据
insert into test(id,body) values(1,'hello,postgresql');

#查看当前数据库下所有表
\d

#查看表结构,相当于desc
\d test

主キー関連: PostgreSQL はシーケンスを使用してフィールドの自己増加を識別し、データ型は smallserial、serial、bigserial です。これらのプロパティは、MySQL データベースでサポートされている AUTO_INCREMENT プロパティに似ています。

  • SMALLSERIAL: 2 バイト、範囲: 1 ~ 32767
  • SERIAL:4バイト、範囲:1~2,147,483,647
  • BIGSERIAL: 8 バイト、範囲 1 ~ 922,337,2036,854,775,807
#创建表
CREATE TABLE COMPANY(
   ID  SERIAL PRIMARY KEY,
   NAME           TEXT      NOT NULL,
   AGE            INT       NOT NULL,
   ADDRESS        CHAR(50),
   SALARY         REAL
);

#插入数据
INSERT INTO COMPANY (NAME,AGE,ADDRESS,SALARY)
VALUES ( 'Paul', 32, 'California', 20000.00 );

INSERT INTO COMPANY (NAME,AGE,ADDRESS,SALARY)
VALUES ('Allen', 25, 'Texas', 15000.00 );
#查询SQL
SELECT * FROM COMPANY where id = 1;
# 更新SQL
UPDATE COMPANY SET  age = 33 where id = 1;

PostgreSQL の構文は基本的に MySQL と似ており、ビジネス開発では curd を記述することが一般的であり、テーブル作成などの操作はビジュアル ツールを使用することで効率化されます。

スキーマ

PostgreSQL スキーマ (SCHEMA) はテーブルのコレクションとして見ることができます。
スキーマには、ビュー、インデックス、データ型、関数、演算子などを含めることができます。
同じオブジェクト名を異なるスキーマで競合なく使用できます。たとえば、schema1 と myschema の両方に mytable という名前のテーブルを含めることができます。
使用パターンの利点:
● 複数のユーザーが互いに干渉することなくデータベースを使用できます。
● 管理を容易にするために、データベース オブジェクトを論理グループに整理します。
● サードパーティ アプリケーションのオブジェクトは、他のオブジェクトの名前と競合しないように別のスキーマに配置できます。
スキーマはオペレーティング システム レベルのディレクトリに似ていますが、スキーマをネストすることはできません。

#创建schema: 
create schema myschema;

create table myschema.company(
   ID   INT              NOT NULL,
   NAME VARCHAR (20)     NOT NULL,
   AGE  INT              NOT NULL,
   ADDRESS  CHAR (25),
   SALARY   DECIMAL (18, 2),
   PRIMARY KEY (ID)
);

#删除schema: 
drop schema myschema;

#删除一个模式以及其中包含的所有对象:
DROP SCHEMA myschema CASCADE;

ここに画像の説明を挿入
構造は上記の通りで、スキーマを作成した後、ライブラリの中にライブラリを作成するような感覚で、2つのスキーマに同じ名前のテーブルを作成できます。

データテーブルのインデックス

一意のインデックスと通常のインデックス

CREATE UNIQUE INDEX "idx_dev_id_user_id" ON "myschema"."device" USING btree (
  "deviceid",
  "userid"
)

psql 共通インデックス:

CREATE INDEX "id_dev_id" ON "myschema"."device" USING btree (
  "deviceid"
)

インデックスの最下層はソート構造であるBtree構造を採用しており、ツリートラバーサルにより目的の結果を素早く見つけることができるため、IO数が大幅に削減され、インデックスが使用されていない場合はフルテーブルスキャンが実行され、インデックスが使用されない場合はフルテーブルスキャンが実行されます

ツリー構造を次の図に示します。
ここに画像の説明を挿入

ハッシュインデックス

ハッシュ テーブル構造を通じてデータを格納します。データを格納するときは、クエリ条件をハッシュ化し、ハッシュ コードを取得し、ハッシュ テーブルから目的の値を取得します。欠点は、クエリ内の = のみがサポートされ、範囲クエリがサポートされていないことです。サポートされています。

CREATE INDEX "idx_name" ON "myschema"."person" USING hash (
  "name"
)

ここに画像の説明を挿入
ビジネス開発では、このインデックスは基本的に使用されず、ビジネスの多くのシナリオではあいまい検索や範囲検索が必要になりますが、ハッシュ インデックスではサポートできません。

転置インデックス

  • 一般化逆インデックス。ジンと呼ばれます。
  • アトミックではなく要素で構成されるデータ型の値を処理します。
  • GIN インデックスは要素の B ツリーで構成され、その B ツリーのリーフ行にリンクされた B ツリーまたは TID のフラット リストが含まれます。
  • 全文検索のパフォーマンスが低いという問題を解決するために、全文検索シナリオで使用されます。
  • 「%xxx%」のようなインデックスの失敗の問題を解決できます。
  1. pg_trgm拡張機能を追加
CREATE EXTENSION pg_trgm;
  1. フィールドにインデックスを付ける
CREATE INDEX "idx_addres" ON "myschema"."person" USING gin (
  "address"
)

フォワードインデックス

キー全体がインデックスで、値がレコードの行全体です。
たとえば、レコード全体の検索名は「zhangsan」、値は「zhangsan」です。正のインデックスの
キーは「zhangsan」です。 、値はレコード全体を保存します。

ID に対応する主キー インデックス、通常のインデックス、ユニーク インデックス、正のインデックス。
ここに画像の説明を挿入

転置インデックス

  • 反転されたテーブルには、単語または語句をキーワードとしてインデックスが付けられます。テーブル内のキーワードに対応するレコード エントリには、その単語または単語が出現するすべてのドキュメントが記録されます。エントリは単語フィールドであり、ID とその文字が出現する場所を記録します。書類。

  • 各単語に対応する文書の数は動的に変化するため、転置リストの作成と維持はより複雑になりますが、クエリの際には、クエリキーワードに対応するすべての文書を一度に取得できるため、効率が高くなります。フォワードリストの表面よりも高い。

  • 全文検索では、検索に対する応答の速さが最も重要な性能であり、インデックス作成はバックグラウンドで行われるため、効率は比較的低いものの、検索エンジン全体の効率には影響しません。

  • 転置テーブルの構造図は以下の通り
    ここに画像の説明を挿入

  • GIN (Generalized Inverted Index、一般転置インデックス) は、ペア (キー、ポスティング リスト) のコレクションを格納するインデックス構造です。ここで、キーはキー値、ポスティング リストはキーが出現した場所のセットです。たとえば、('hello', '14:2 23:4') では、hello が 14:2 と 23:4 の 2 つの位置に出現することを意味し、PG 内のこれらの位置が実際にはタプルの tid です。

  • テーブル内の各属性は、インデックス作成時に複数のキー値に解析される可能性があるため、同じタプルの tid が複数のキーの投稿リストに表示される場合があります。

  • このインデックス構造により、指定したキーワードを含むタプルをすぐに見つけることができるため、GIN インデックスは全文検索のサポートに特に適しており、PG の GIN インデックス モジュールも全文検索をサポートするために開発されています。

psql 要点インデックス

  • Gist (Generalized Search Tree)、一般的な検索ツリー。btree と同様に、バランスのとれた検索ツリーでもあります。
  • Btree は等価検索と範囲検索に使用されます。
  • 生活の一部のシーンでは、地理的位置、空間的位置、画像データなどの多次元データを保存する必要があり、特定の場所にあるか、特定の場所のデータであるかを判断する必要があることがよくあります。地理的な位置が「含まれる」かどうかを判断し、Gist インデックスを使用できます。

使用するシーン

  1. ジオメトリ タイプ。距離順に並べ替えられた位置検索をサポートします。
  2. 範囲タイプ、位置検索をサポートします。
  3. 空間タイプ (PostGIS)、距離順に並べ替えられた位置検索をサポートします。
    このシーンは今のところ考えられていません。

使いやすい

1. テストテーブルを作成します。

create table company(id int, location point);    

ここに画像の説明を挿入
2. 場所のインデックスを設定する

CREATE INDEX "idx_location" ON "myschema"."company " USING gist (
  "location"
)
  1. 100,000 個のデータのランダム挿入を追加
insert into company select generate_series(1,100000), point(round((random()*1000)::numeric, 2), round((random()*1000)::numeric, 2));  
  1. お問い合わせ
select * from company where circle '((100,100) 50)'  @> location;    

座標 (100,100) の上下 50 の範囲内のすべてのデータを検索すると、結果は次のようになります。
ここに画像の説明を挿入

Explain を使用して実行計画を表示します。

explain (analyze,verbose,timing,costs,buffers) select * from company where circle '((100,100) 50)'  @> location;

ここに画像の説明を挿入

ページングの実行計画を再度確認してください。

explain (analyze,verbose,timing,costs,buffers) select * from company where circle '((100,100) 50)'  @> location ORDER BY id  limit  10 OFFSET 11;

ここに画像の説明を挿入
ビットマップ インデックス スキャン、ビットマップ ヒープ スキャン、ソートの 3 つのタイプがあります。

ページネーション検索シーン

ビジネス開発では、検索にページング操作が含まれることがよくありますが、PostgreSQL と MySQL は一貫性がなく、limit xxx, xxx を使用する代わりに、limit xx offset xx を使用します (たとえば、10 データのページの最初のページを検索する場合)

select * from company where circle '((100,100) 50)'  @> location ORDER BY id  limit  10 OFFSET 1;

ここに画像の説明を挿入
2 ページ目、11 番目のアイテムは 20 アイテムに相当します

select * from company where circle '((100,100) 50)'  @> location ORDER BY id  limit  10 OFFSET 11;

ここに画像の説明を挿入

ユーザー操作

#创建用户并设置密码
CREATE USER 'username' WITH PASSWORD 'password';
CREATE USER test WITH PASSWORD 'test';

#修改用户密码
$ ALTER USER 'username' WITH PASSWORD 'password';

#数据库授权,赋予指定账户指定数据库所有权限
$ GRANT ALL PRIVILEGES ON DATABASE 'dbname' TO 'username';
#将数据库 mydb 权限授权于 test
GRANT ALL PRIVILEGES ON DATABASE mydb TO test;
#但此时用户还是没有读写权限,需要继续授权表
GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO xxx;
#注意,该sql语句必须在所要操作的数据库里执行

#移除指定账户指定数据库所有权限
REVOKE ALL PRIVILEGES ON DATABASE mydb from test

#删除用户
drop user test

# 查看用户
\du

pg_hba.conf 構成の最初の設定は、ローカル ユーザーが UNIX ソケット経由でログインするときにピア認証を使用することを意味します。

# "local" is for Unix domain socket connections only
local   all             all                                     peer
  • ピアは、PostgreSQL が配置されているオペレーティング システムにユーザーとしてログインしています。
    ピア モードでは、クライアントは PostgreSQL と同じマシン上に存在する必要があります。現在のシステムユーザーがPostgreSQLにログインするユーザー名と同じであればログインできます。
    PostgreSQL をデプロイした後、システムの postgres ユーザーに切り替えた後、psql を直接実行して PostgreSQL に入ることができます (現在のシステム ユーザーの名前は postgre で、PostgreSQL のユーザー名も postgre です)。

PostgreSQL のロール管理

PostgreSQL ではユーザーとロールを区別する概念がありません。「CREATE USER」は「CREATE ROLE」の別名です。これら 2 つのコマンドはほぼ同じです。唯一の違いは、「CREATE USER」コマンドで作成されたユーザーがデフォルトでは LOGIN 属性があり、「CREATE ROLE」コマンドで作成されたユーザーにはデフォルトでは LOGIN 属性がありません。

postgres=# CREATE ROLE david;  //默认不带LOGIN属性
CREATE ROLE
postgres=# CREATE USER sandy;  //默认具有LOGIN属性
CREATE ROLE
postgres=# \du
                             List of roles
 Role name |                   Attributes                   | Member of 
-----------+------------------------------------------------+-----------
 david     | Cannot login                                   | {}
 postgres  | Superuser, Create role, Create DB, Replication | {}
 sandy     |                                                | {}

postgres=# 
postgres=# SELECT rolname from pg_roles ;
 rolname  
----------
 postgres
 david
 sandy
(3 rows)

postgres=# SELECT usename from pg_user;         //角色david 创建时没有分配login权限,所以没有创建用户
 usename  
----------
 postgres
 sandy
(2 rows)

postgres=#

権限を更新します。

postgres=# ALTER ROLE bella WITH LOGIN;
ALTER ROLE
postgres=# \du
                             List of roles
 Role name |                   Attributes                   | Member of 
-----------+------------------------------------------------+-----------
 bella     | Create DB                                      | {}
 david     |                                                | {}
 postgres  | Superuser, Create role, Create DB, Replication | {}
 renee     | Create DB                                      | {}
 sandy     |                                                | {}

postgres=#

キャラクター属性

  • ログイン: データベース接続の初期ロール名として使用できるのは、LOGIN 属性を持つロールのみです。
  • スーパーユーザー: データベーススーパーユーザー
  • createdb: データベースの作成権限
  • createrole: 他の通常のユーザー ロール (スーパーユーザーを除く) を作成または削除できるようにします。
  • パスワード: md5 やパスワード モードなど、ログイン時にパスワードの指定が必要な場合にのみ機能します。これは、クライアントの接続認証方法に関連します。
  • レプリケーション: ストリーム レプリケーションを実行するときに使用されるユーザー属性。通常は個別に設定されます。

コマンドラインモードでの一般的なコマンド

\password命令(设置密码)
\q命令(退出)
\h:查看SQL命令的解释,比如\h select。
\?:查看psql命令列表。
\l:列出所有数据库。
\c [database_name]:连接其他数据库。
\d:列出当前数据库的所有表格。
\d [table_name]:列出某一张表格的结构。
\du:列出所有用户。

要約する

  1. PostgreSQL は MySQL よりも強力で、構文が近いため、簡単に理解できます。
  2. 独自インデックス、共通インデックス、ハッシュインデックスに加え、GINインデックス、GISTインデックスの新機能も追加され、ビジネスシーンの幅が広がります。
  3. Oracle にはお金が必要ですが、PostgreSQL は無料です。将来的には、厳密なエンタープライズ シナリオでは、Oracle が占める割合はますます少なくなり、徐々に PostgreSQL に置き換えられるでしょう。
  4. Mysql + PostgreSQL が将来のトレンドになるため、開発者はこれら 2 つの要素を理解する必要があります。
  5. 将来的には、継続的な学習が必要な高度なコンテンツが登場する予定です。

おすすめ

転載: blog.csdn.net/yaoyaochengxian/article/details/131975671
おすすめ