2009-07-30 8 views
8

INDEX式は何をしますか?終わりに例:Postgresのインデックス?

CREATE TABLE tags (
    tag_id      varchar(255) NOT NULL, 
    "{Users}{userID}question_id" int4 NOT NULL, 
    tag       varchar(20), 
    CONSTRAINT tag 
    PRIMARY KEY (tag_id)); 
CREATE INDEX tags_tag 
    ON tags (tag); 
+5

このような質問を下さった人々には何が間違っていますか?これは完全に有効な質問です。実際には、データベースに関するすべてのことを知っていて、インデックスの仕組みを説明できない人がたくさんいます。 –

答えて

10

indexインデックスのフィールド(単数または複数)に基づいてデータベース検索の個々の行への高速アクセスを助けることができるデータベース構造です。あなたの例では

は、CREATE INDEX文は、列tagを使用してテーブルの上にtagstags_tagという名前のインデックスを作成します。 tagフィールドに基づいてテーブルから行を検索する場合、データベースはインデックスを使用して行をより効率的に検索します。インデックスがなければ、データベースはテーブルのフルスキャンに頼らざるを得ず、テーブルのサイズ、値の分布、正確なクエリ基準など、多くの要因によります。また、異なるデータベースは異なるタイプの索引もサポートしており、さまざまな方法でデータを検索できます。

インデックスの欠点もあります。インデックスごとに、そのテーブルの書き込み速度が低下します。行を挿入すると、索引を持つということは、行自体へのデータベース書込みに加えて、索引も更新する必要があることを意味します。

インデックスを配置する列を決定するのは難しいことがあります。また、実際のデータに対するベンチマークや実際のクエリはパフォーマンスを測定する最も正確な方法です。一般的に、検索する列の索引が必要になります。したがって、もしあなたがtagで行を検索したいと思えば、インデックスをそこに置くのは間違いありません。しかし、あなたがアドレス帳を持っているなら、(おそらく)ストリート、ZIP /郵便番号、または電話番号で検索する必要はありませんので、書き込みパフォーマンスに値する価値はないでしょう。

主キー列には、ほとんどの場合、データベースによって自動的に生成されるインデックスがあります。また、特定の列の値を一意に保持したい場合は、UNIQUE INDEXを作成してこれを強制することができます。

Thisここでは、データベースインデックスの経験則について尋ねます。これは役に立つかもしれません。

+0

インデックスが必要なときには、何らかのタイプの歯ブラシがありますか?私はむしろ、SOスタイルのタグがおそらくボトルネックを早めるアクセス速度を持っているので、この例ではintuintively indexを選んだ。 –

+0

インデックスですか? md5deep(question_id、user_id、time)-hashを各値を個別に照会するのではなく、主キーとしてテーブルに保存しますか? –

+0

これは、トレードオフのためのアクセス時間を向上させます。 –