2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

PostgresでIndexによる実行速度の違いを調査した

Last updated at Posted at 2020-05-16

Indexとは

インデックスの意味とメリット・デメリット

要するに索引で、対象のカラムを高速に検索するために利用される。
実装は対象のカラムとIDの組を、対象カラムの内容でソートしたものがある。
(他にもありそう)

イメージとしては、よく技術本の索引で用語集みたいなのがアルファベット順で並べてあるのを思い浮かべた。
「Index」を調べようとしたら、アルファベット順に並んだものからすぐに「Index」を見つけられ、Indexが記載されたページ(ID)がすぐ分かる。

一方、DBの内容を変更する操作はIndexを更新する必要があるため遅くなる。
これも本の索引を調べたらすんなり分かる。

実験

準備

実験のためDockerでPostgresサーバーを立てた。

version: "3.1"
services:
  db:
    image: postgres:12.2
    restart: always
    environment:
      - POSTGRES_USER=postgres
      - POSTGRES_PASSWORD=example
      - PGPASSWORD=example
      - POSTGRES_DB=testdb
  adminer:
    image: adminer
    restart: always
    ports:
      - 8080:8080

テーブルを作成した。

CREATE TABLE "one" (
  "id" serial NOT NULL,
  "name" character(50) NULL,
  "age" integer NULL
);

名前と年齢のデータで年齢でユーザーを検索するイメージ。
適当です。

実験用のSQL

インデックスを貼る

CREATE INDEX "one_age" ON "one" ("age");

データを入れる
1千万行入れます。
検索予定のageは1歳から200歳までランダムで挿入します。

INSERT INTO "one" (id,name, age) 
 SELECT 
     i, format('テスト%s', i), (random()*200)::int
 FROM
     generate_series(1,10000000) as i
;

データを検索する

SELECT
	*
FROM
	one
WHERE
	age = 30
;

実験結果

速度測定のためにpostgresのCUI上で\timingを使い、SQLを実行しました。

挿入 検索
インデックス無し 24s 0.8s
インデックス有り 49s 0.3s

結構影響ありますね。

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?