postgresqlデータベースにインデックスを作成する方法
ビットコインが取引停止になったり、LINEがスタンプを自由に作れるようにしたり、何かとにぎやかな業界ですが、そんなにぎやかさを横目に、粛々とDBのチューニングしてます。
前回に引き続き、WEBサイトの表示速度をスピードアップさせる方法です。
前回はHTMLや画像やCSSといったファイルを、ブラウザのキャッシュを利用したり圧縮を有効にしたりすることで高速化を図ってきました。
それだけではまだスピードが不足していると感じたので、さらにスピードアップを図ります。
PageSpeed Insightsの結果で「サーバの応答速度を短縮する」という項目があります。
「サーバの応答速度を短縮する」とはどういうことか?
下記のページを見ると、サーバの応答速度を遅らせる要因がさまざまにあることを教えてくれます。
Improve Server Response Time
https://developers.google.com/speed/docs/insights/Server
- 遅いアプリケーションロジック
- 遅いデータベースクエリ
- ルーティング
- フレームワーク
- ライブラリ
- CPUリソース不足
- メモリ枯渇
データベースにインデックスを作成する
フレームワークも使っているし、ハード的なリソースも不足していると言えばしているし、そもそもアプリケーションロジックが遅い・・・と自分のサイトで疑わしいところは色々あるのですが、今回は「遅いデータベースクエリ」に注目します。
遅いデータベースクエリを改善するにはどうするか?
データベースにインデックスを張る方法に目を向けてみます。
1.遅いクエリを選定する
前回のエントリーで、postgresqlのスロークエリを取得する方法をポストしました。
まずこの方法で遅いクエリがどれか選定します。ここでは複数クエリを出しておきます。
2.よく使われる部分を抜き出す
複数のクエリを見て、重複している部分があれば、その部分を抜き出します。
重複している部分は言い換えると「良く使われる部分」ということです。
だから重複するんですね。
3.カラムを指定する
重複している部分が判明したら、どのカラムが関係しているかを確認します。
ここが勘所です。基本的にはWhere句で検索条件になっているようなカラムが有力ですが、それ以外にもいくつかあります。
- Where句で検索条件になっているカラム(前方一致検索は除く)
- ORDER BYの対象になっているカラム
- GROUP BYの対象になっているカラム
- 重複が少ないカラム
- 抽出結果が少ないカラム
※注意点として、「重複の多いカラムにはあまり意味がない」ということがあります。
たとえば、性別などのデータにはほとんど効果がないようです。
重複の少ないカラムが有効なんですね。
4.インデックスを張る
インデックスを張るカラムを決めたら、さっそく張ってみます。
基本的に下記のように張ります。
CREATE INDEX index_name ON table_name (column_name);
インデックスが張れたか、確認してみます。
確認は次のようなpsqlコマンドです。
\di
これで登録済みのインデックス一覧が確認できます。
試してみる
これでサイトを再び見てみましょう。
早くなってたらガッツポーズ。
早くなってなかったら、その部分が原因ではなかったということです。
SQLクエリをもう一度調べてみて、上記1.~4.を繰り返します。
ちなみに、インデックスを削除する方法は下記の通りです。
DROP INDEX name index_name;
どうでしょう?早くなりましたか~?
Google AD
関連記事
-
-
【今さら】ブラインドタッチができるようになるまでにやった3つの事【もういいでしょ】
過去、仕事で一緒になった人がブラインドタッチが苦手だということがありました。 両手の人差し
-
-
SVNリポジトリのリプレース(とeclipseの設定)
SVNリポジトリのリプレースを行ったのでエントリー。 1.リポジトリをdump svn
-
-
ipad2買ったら、コレは買っとけ的なもの その2
前回に引き続き、買ってよかったipadアプリです。i文庫HD以前PDF化した本を読むのにデフォルトの
-
-
紛糾!システム構築の巻
システム作る時って、会社の縮図だと思う。いろいろな立場の人の思惑や損得が入り混じり、考えが違うために
-
-
postgresqlのスロークエリ(スローログ)を取得する
45年ぶりの雪が、1週おきに降るってどういうことでしょうか? とは言え、雪が降るといつもと
-
-
zenphotoを入れてみる
これまでの写真データ管理にはGoogleのWEBアルバムを使ってきたが、無料で使えるのは1GBまでだ
-
-
wordpressのパーマリンク設定を変更してみたら大丈夫だった件
wordpressでパーマリンクを変えようと思ってたんですが、なかなか踏み切るタイミングがな
-
-
cakephpでユーザ定義定数を読みだす方法
サイトを作るにあたって、定数を使いたいときがよくあります。 サイト上のある数値に変更があっ
-
-
Pear::pager と TwitterBootstrap をマッシュアップしてみた
前回に引き続き、WEBアプリをカスタマイズしてみました。 DB使って商品登録をしてると
-
-
wordpressからbloggerに引越し
lolipopで使っているロリポプランは、DBが一つしか使用できない。もうちょっと有効に使えないかと