はじめに
Desksetapp作成で開発したTBLを使って、Indexなどの開発を行いました。
背景
Desksetappを作成したさい、デプロイ時は数件程度のデータしか情報として入れていませんでした。
しかし規模を拡大するさいは、多くのデータが必要となります。
数百万のデータを取り扱うさい、今の状態だとかなり検索に時間がかかってしまうので、その解消のためにIndexなどを使いました。
(今回は開発用のデータを用いて確認しました。)
Indexとは、検索を早くするDB構造です。
本でいう目次のような役割をしています。
目次から読む場所を見つけることと同じでTBLから特定の項目データを見つけることを指します。
今回使用したTBL
workspace_sets
| Name | Type | option |
|---|---|---|
| id | int8 | |
| title | varchar | |
| budget | int8 | non-null |
| space | int8 | non-null |
| color | varchar | non-null |
| use_case | varchar | non-null |
Index前後の状態
EXPLAIN analyse
SELECT *
FROM workspace_sets_dev
WHERE budget = 100000;
Seq Scan on workspace_sets_dev (cost=0.00..2975.41 rows=14441 width=102) (actual time=0.029..1028.252 rows=14409 loops=1)
Index前実行前にSQLを流すと約1028 msかかりました。
CREATE INDEX idx_workspace_sets_dev_budget
ON workspace_sets_dev (budget);
INDEXのSQLを流した後、再度SELECT文を実行すると 、以下の結果になりました。
Bitmap Heap Scan on workspace_sets_dev (cost=126.48..2031.94 rows=14437 width=102) (actual time=10.516..15.741 rows=14409 loops=1)
約16 msかかりました。60倍ほど高速化しています。
今はbudget(予算)だけでしたが、TBL項目を増やした場合、どうなるのかも確認しました。
EXPLAIN analyse
SELECT *
FROM workspace_sets_dev
WHERE budget = 100000
and space <= 100
and color = 'black';
Bitmap Heap Scan on workspace_sets_dev (cost=123.11..2100.76 rows=965 width=102) (actual time=10.050..707.145 rows=921 loops=1)
結果は約707 msとなっています。
CREATE INDEX idx_workspace_sets_dev_search
ON workspace_sets_dev (budget, space, color);
再度実行すると、
Bitmap Heap Scan on workspace_sets_dev (cost=66.41..863.85 rows=965 width=102) (actual time=3.247..5.019 rows=921 loops=1)
結果は約5 msと下がりました。
おわりに
業務でも扱ったことが少なかったので、勉強になりました。
参考文献
