テーブル定義書作成時のIndex付加について

このQ&Aのポイント
  • テーブル定義書作成時にIndexを付加する方法や考慮点について知りたいです。
  • Indexを作成する対象となる項目やそのメリット・デメリットについて教えてください。
  • テーブル結合時のIndexの動作や書き方、フォーマットについて知りたいです。
回答を見る
  • ベストアンサー

テーブル定義書作成時のIndex付加について

基礎的なことで申し訳ございませんが、 お力添えよろしくお願いいたします。 CentOs 5 & PostgreSQL 8.4.9にてDB構築しております。 DB構築から、テーブル作成・項目追加・キー設定まで行いまして、 検索する際に、抽出件数が多く負荷のかかりそうなものに Indexを作成しようと考えております。 ■本題  1.Indexを作成する対象となる項目の、目安としてどのようなものが考えられるでしょうか。   ・キー対象の項目になっているもの   ・検索条件の対象となる項目なども当たるでしょうか  2.項目をまとめて一つのIndexにするメリット・デメリットはどのようなものでしょうか   3.テーブル結合したときのIndexの動作    例) 下記のようなテーブルがあった場合 tablea(データ50000件程度) hoge_id pkey1 hoge_no hoge_nm ... tableb(データ150000件程度) test_id pkey1 hoge_id pkey2 hoge_betu_kb ...     select t1.hoge_id, t1.hoge_nm, t2.hoge_betu_kb rom tablea as t1 leftjoin tableb as t2 on t1.hoge_id = t2.hoge_id where t1.hoge_id > '100' and t1.hoge_nm like 'あいう%'   このような場合のIndex作成は、 A. Create index idx_tablea_hoge_id ON tablea (hoge_id); B. Create index idx_tablea_hoge_id ON tablea (hoge_nm); C. Create index idx_tableb_hoge_id ON tableb (hoge_id); ←tableaで指定しているのでこれは不要?  4.A.B.C.のようなIndex作成した際のテーブル定義の書き方   テーブル定義書のフォーマットは定められており、お門違いな質問かとは存じてはおりますが、   テーブル定義にIndex定義を書く場合に、添付した画像のようなフォーマットの書き方が   よく理解できずお気づきの点などございましたら、ご指摘願えたら助かります。   (以前は、CSEツールなどで自動出力される定義書のような書き方をしていたもので・・・)         例)tablea IDX1 IDX2 IDX3 hoge_id 1 hoge_nm 2 このような書き方になるのかどうか?      IDX2, IDX3の項目とは?どのようなIndex定義をした際に書き込むことになるのかが判らず。。。      基礎から勉強しなおすべきとは存じておりますが。。。 現状の期間あまり時間がないことと、 DB構築を一人で行っており、このような内容を相談できるものがおりませんゆえ、 改めて、Index付加することを考えてみると、いまさら聞けないような内容かもしれませんが ちゃんと把握したうえで、テーブル構築したいと思いますので 今までの他の皆様の経験からのノウハウなども踏まえて、 ご教授いただけると大変助かります。

  • -0-y
  • お礼率75% (59/78)

質問者が選んだベストアンサー

  • ベストアンサー
  • maniacpa2
  • ベストアンサー率100% (2/2)
回答No.1

1:index作成の目安について 検索の条件になる項目で、重複があまり無い項目を作成すれば良いのでは無いでしょうか。また、テーブル作成時に特定のカラムに対してPKを設定するのであれば、PKには自動的にindexが付与されるので、ベット作成の必要は無いかと思われます。 いったん、テーブルを作ってみて、使いたいSQLをexplain analyzeで実行してみて、処理が遅い部分に関係しているカラムに対してindexを設定して行く方法をお勧めします 2:複合indexのメリット indexサイズが小さくなります。ただ、指定の順番を間違うとindexが使われなくなるときもあります。 3:indexの付与対象について indexはテーブルのカラムに対して付与するので、同一カラム名のindexを他のテーブルに作ったからと言って、違うテーブルで作成しなくて良い訳ではありません。 4についてはご質問の意図がよくわかりませんでした。 私の回答がお役に立てるようであれば幸いです。

-0-y
質問者

お礼

ありがとうございます。 4の質問に関しましては、定義書の書き方で効率のよい書き方があれば という内容でしたが、内部でよく話し合って書き方は精査したいと思います。 1,2,3の内容に関しましては、大変参考になりました。 また質問する機会ございましたら、よろしくお願いいたします。

関連するQ&A

  • UNIQUEをつけたときのINDEXテーブル

    テーブル作成時、カラムにUNIQUEをつけると自動でインデックステーブルが作成されますが、このインデックステーブルで、通常のselect検索も早くなるのでしょうか? 具体的には、ユニークなカラムidを持つテーブルtableA create table tableA( id INTEGER UNIQUE, some_column INTEGER ); を作ったあとで、そのidにあらためて CREATE INDEX id ON tableA (id); と、インデックスを張る必要があるのでしょうか。 よろしくお願いします。

  • 3つのテーブルを結ぶSQLの書き方

    お世話になります。 3つのテーブルを結びつけるSQLの書き方がわかりません。ご指導お願いします。 [TableA][ID] [TableB][ID] [TableC][ID] [TableA]と[TableB]をLEFT JOINでつなぐ。 上の結果を[TableA][ID]と[TableC][ID]でInner joinでつなぐ。 つまり・・・ SELECT TableA.ID,TableB.ID FROM TabelA LEFT JOIN TableB→この結果 SELECT TableA.ID,TableB.ID TableC.ID From この結果 INNER JOIN TableC ON TableA.ID = TableC.ID こんな感じのことをやりたいのですが、記述の方法がわかりません。 どなたかお知恵をお貸しください。

  • AUTO_INCREMENTのあるテーブルにinsertできません(長文)

    mysql5.0.27(RedhatLinux 9)です。 属性のひとつがAUTO_INCREMENTになっているテーブルhogeに、データをinsertしたいのですが、「コラムの数が合致しない」というエラーで、insertできません。 Webをいろいろ漁って、AUTO_INCREMENTの属性は明示的に指定しないようだと理解しました。冗長で申し訳ないのですが、エラーが出た状態のものを、そのまま掲載させていただきます(テーブル名や属性名のみ変更しました)。 状態をまとめると、以下のようになります。 ・下記のテーブル定義で、テーブルは普通にcreateできた。 ・descで確認しても、ちゃんとテーブルはできているよう。 ・下記のinsert文で、その下のエラーメッセージが出て、データを登録できない。 ・どうみても、コラム数は合っている(と思う)。 ・下記のテーブル定義の属性数を適当に減らす(id, item1, item4, item6くらいにする)と、エラーが出ずデータがちゃんとinsertできる。 私はなにか、とんてもない勘違いをしているのでしょうか?かなりの時間試行錯誤しているのですが、一向にわかりません。。。 ===== テーブル定義 ===== CREATE TABLE hoge ( id MEDIUMINT UNSIGNED AUTO_INCREMENT NOT NULL, item1 VARCHAR (64) NOT NULL, item2 VARCHAR (64) NOT NULL, item3 VARCHAR (32) NOT NULL, item4 VARCHAR (64), item5 VARCHAR (64), item6 VARCHAR (16) NOT NULL, CONSTRAINT PK_HOGE PRIMARY KEY (id) ) type=innodb; CREATE INDEX IDX_HOGE_1 ON hoge(item1); CREATE INDEX IDX_HOGE_2 ON hoge(item2); CREATE INDEX IDX_HOGE_3 ON hoge(item3); CREATE INDEX IDX_HOGE_4 ON hoge(item4); CREATE INDEX IDX_HOGE_5 ON hoge(item6); ===== descの出力 ===== +---------------------+-----------------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +---------------------+-----------------------+------+-----+---------+----------------+ | id | mediumint(8) unsigned | NO | PRI | NULL | auto_increment | | item1 | varchar(64) | NO | MUL | | | | item2 | varchar(64) | NO | MUL | | | | item3 | varchar(32) | NO | MUL | | | | item4 | varchar(64) | YES | MUL | NULL | | | item5 | varchar(64) | YES | | NULL | | | item6 | varchar(16) | NO | MUL | | | +---------------------+-----------------------+------+-----+---------+----------------+ 7 rows in set (0.00 sec) ===== insert文 ===== insert into hoge (item1, item2, item3, item4, item5, item6) values ( 'data1','data2', 'data3', 'data4', 'data5', 'data6'); ===== エラーメッセージ ===== ERROR 1136 (21S01) at line 1: Column count doesn't match value count at row 1 長文大変申し訳ありません。よろしくお願いします。

  • 異なるテーブル間の和

    テーブルAの属性item1とテーブルBのitem1の和を求めるにはSQLでどのように記述すれば良いのでしょうか?? tableA ------ id item1 item2 pointer tableB ------ id item1 item2 pointer という2つのテーブルで,tableBのpointerはtableAのidを指しています.

  • postgres table作成時にindex付与

    MySQLでは以下のようにテーブル作成時にインデックス付与ができます。 CREATE TABLE test ( a int(11) NOT NULL DEFAULT '0', b int(11) DEFAULT NULL, PRIMARY KEY (a), KEY test_idx (b), -- ★インデックス その1 KEY test_idx2 (a) -- ★インデックス その2 ); ポスグレではできませんか?

  • SQL:テーブル結合で該当レコードがない場合

    SELECT TableA.ID,SUM(TableA.量),TableB.金額 FROM TableA,TableB WHERE TableA.ID = TableB.ID GROUP BY TableA.ID,TableA.量,TableB.金額 こんな感じのSQLなんですが TableAをメインテーブルとして ↓のような結果を得るように作り変えれないか考えています ■TableBとの結合レコードあり(金額登録あり) 1,50,1500 ■TableBとの結合レコードあり(金額登録なし) 1,50,(NULLかスペース) 考えているんですが思いつかないのでヒントいただけたらと思います。宜しくお願いします。

  • インデックスの作成

    インデックスを複数作成する理由がわかりません。 TESTテーブルにA,B,C,Dという項目があった場合、 TEST_IDX(A,B,C,D)のように作ってしまえば、いずれの 項目にもインデックスが貼られているので、それでOK というわけにはいかないのでしょうか? 例えばインデックスを 1.TEST_IDX_1(A,B) 2.TEST_IDX_2(B,C) 3.TEST_IDX_3(D) のように作成する理由とは何でしょうか?

  • 2つのテーブルの連動

    MySQL3を使っています。 [tableA] ID |NUM ------- abc|1 def|2 ghi|3 [tableB] ID |TEXT ------- def|あいうえお abc|かきくけこ def|さしすせそ のような2つのテーブルがあって、[tableB]のデータを[tableA]のNUM列の番号順に、出力するにはどうすればいいのでしょうか? 上の例で行くと、 abc|かきくけこ def|あいうえお def|さしすせそ こんな感じの並びにしたいのです。

    • ベストアンサー
    • MySQL
  • テーブルにはったインデックスは、ビューに対しても効力があるのか

    環境:RedHat Linux AS3.0 / PostgresSQL 7.3.6 Publicスキーマにインデックス付きのテーブルを作成し、 複数のスキーマにビューを作成してそのテーブルをそのまま参照したいと思っています。 (スキーマの数が非常に多いので、実体をひとつにし、  ディスク容量を抑えるのが目的です。) 環境のイメージは以下の通りです。 ◆Publicスキーマにテーブル作成------- create table TEST_TABLE ( id int, data varchar ); ◆test_tableにインデックスを作成------- create unique index TEST_KEY on TEST_TABLE ( id ); ◆test_schemaスキーマを作成------- create schema TEST_SCHEMA; ◆test_schemaスキーマにビューを作成------- create view TEST_SCHEMA.TEST_VIEW as select id, data from TEST_TABLE ; このような環境にて「TEST_VIEW」にSELECTをかけた場合、 「TEST_KEY」は踏襲されるのでしょうか? ビューに対してインデックスは作成できないようなので、 テーブルに対してはられたインデックスはビューでも生きている のではないかと考えたのですが、 上記認識で合っているかどうか ご存知の方がいらっしゃいましたらご教授頂けると助かります。 宜しくお願い申し上げます。

  • 効率的なインデックスのつけ方は?

    効率的なインデックスのつけ方は? MYSQLでのインデックスのつけ方をご教授して頂けますでしょうか? ・データ数とかその他もろもろにもよるかと思いますが、一般的に考えてってことでよろしくお願いいたします。 以下のようなテーブル定義があったとします。 CREATE TABLE TEST_TBL ( C1 VARCHAR(10) NOT NULL, C2 VARCHAR(10) NOT NULL, C3 VARCHAR(10) NOT NULL, C4 VARCHAR(10) NOT NULL, PRIMARY KEY (C1) ) 検索条件としては、 ・(C1) ・(C2) ・(C3) ・(C4) ・(C1,C2) ・(C1,C3) ・(C1,C4) ・(C2,C3) ・(C2,C4) ・(C3,C4) ・(C1,C2,C3) ・(C1,C2,C4) ・(C1,C3,C4) ・(C2,C3,C4) ・(C1,C2,C3,C4) と言うような、すべての場合の条件があるとします。 それぞれの検索条件の頻度は同程度とします。 この場合、どのINDEXとどのINDEXを作成するがベターなのでしょうか? 1. CREATE INDEX TEST_IDX1 ON TEST_TBL (C1); 2. CREATE INDEX TEST_IDX1 ON TEST_TBL (C2); 3. CREATE INDEX TEST_IDX1 ON TEST_TBL (C3); 4. CREATE INDEX TEST_IDX1 ON TEST_TBL (C4); 5. CREATE INDEX TEST_IDX1 ON TEST_TBL (C1,C2); 6. CREATE INDEX TEST_IDX1 ON TEST_TBL (C1,C3); 7. CREATE INDEX TEST_IDX1 ON TEST_TBL (C1,C4); 8. CREATE INDEX TEST_IDX1 ON TEST_TBL (C2,C3); 9. CREATE INDEX TEST_IDX1 ON TEST_TBL (C2,C4); 10.CREATE INDEX TEST_IDX1 ON TEST_TBL (C3,C4); 11.CREATE INDEX TEST_IDX1 ON TEST_TBL (C1,C2,C3); 12.CREATE INDEX TEST_IDX1 ON TEST_TBL (C1,C2,C4); 13.CREATE INDEX TEST_IDX1 ON TEST_TBL (C1,C3,C4); 14.CREATE INDEX TEST_IDX1 ON TEST_TBL (C2,C3,C4); 15.CREATE INDEX TEST_IDX1 ON TEST_TBL (C1,C2,C3,C4);

    • ベストアンサー
    • MySQL