*インデックス [#n7bfe1b4]

**インデックスの表示 [#fe76d07d]
***MySQL [#jaa93826]
 SHOW INDEX FROM sample_table;

***PostgresSQL [#l9c92425]
 \di

**制約とインデックス [#ida10e08]

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

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

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

**インデックスをはる場合の注意 [#k06da0bb]
MySQLもPostgresSQLも、膨大な文字数が入るカラムにインデックスを定義したり、不必要なインデックスを定義すると

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

**Text型にインデックスをはる場合 [#o513898d]

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

 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 全文検索:http://dev.mysql.com/doc/refman/4.1/ja/fulltext-search.html]]

参照 : [[MySQLで全文検索 - FULLTEXTインデックスの基礎知識:http://www.tatamilab.jp/rnd/archives/000389.html]]


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

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

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

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

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


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

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

***MySQL [#iae3ada4]
 EXPLAIN コマンド

***PostgresSQL [#g9308677]
 EXPLAIN ANALYZEコマンド

参照 : [[インデックス使用状況の検証(PostgreSQL 8.2.3):http://www.postgresql.jp/document/pg823doc/html/indexes-examine.html]]

**LIKE検索 [#s76b9da1]
***PostgresSQL [#e971cfac]
先頭に % が付いていると、indexは一切使用されない。先頭の % はない方がほとんどの場合、高速。

#counter


トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS