インデックス

インデックスの表示

MySQL

SHOW INDEX FROM sample_table;

PostgresSQL

\di

制約とインデックス

MySQLもPostgresSQLも、制約を追加すると以下のようにインデックスを生成してくれる。

そのため、CREATE INDEXを行う必要はない。

主キー制約(PRIMARY KEY)   ・・・一意なインデックスを生成する
外部キー制約(FOREIGN KEY) ・・・インデックスを生成する
一意制約(UNIQUE)          ・・・一意なインデックスを生成する

インデックスをはる場合の注意

MySQLもPostgresSQLも、膨大な文字数が入るカラムにインデックスを定義したり、不必要なインデックスを定義すると

更新系のSQL(INSERT、UPDATE、DELETE)が実行されたときに処理が重くなる。

Text型にインデックスをはる場合

MySQL

普通にインデックスを作成する場合は、以下のようにする。

mysql> CREATE INDEX part_of_name ON customer (name);

nameカラムの最初の10文字を使用したインデックスを作成する場合は、以下のようにする。

mysql> CREATE INDEX part_of_name ON customer (name(10));

カラムの一部でインデックスを作成するとインデックスファイルのサイズを大幅に削減できるため、

ディスク領域が節約されるとともに、更新系のSQL(INSERT)操作が迅速化される場合がある。

なお、MySQLではFULLTEXTインデックスというのがあるらしい。(使ったことないけど。。)

参照 : MySQL 全文検索

参照 : MySQLで全文検索 - FULLTEXTインデックスの基礎知識

PostgresSQL

普通にインデックスを作成する場合は、以下のようにする。

mysql> CREATE INDEX part_of_name ON customer USING btree (name);

nameカラムの最初の10文字を使用したインデックスを作成する場合は、作成方法がわからにゃい。。

「部分インデックス」とか使うのかもしれないけど、ほとんどの場合、部分インデックスや一意インデックスより通常のインデックスの方が有効である、

とマニュアルにあるので、あまり変なことはしないで、普通にindexを張ったほうがよさそう。。。なのかな。

インデックスの検証

インデックスなしの状態で検索をしてみた速度(処理時間)とインデックスをはった後の速度を比較する。

どのインデックスが実際の問い合わせで使われているかを確認するには、EXPLAINコマンドを実行する。

MySQL

EXPLAIN コマンド

PostgresSQL

EXPLAIN ANALYZEコマンド

参照 : インデックス使用状況の検証(PostgreSQL 8.2.3)

LIKE検索

PostgresSQL

先頭に % が付いていると、indexは一切使用されない。先頭の % はない方がほとんどの場合、高速。

Counter: 6788, today: 2, yesterday: 0

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2013-09-24 (火) 14:56:23 (1283d)