こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

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

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

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);

投稿日時 - 2008-04-14 17:35:23

QNo.3948558

すぐに回答ほしいです

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

まだ情報が不足してます。
・c3、c4はカーディナリティ低いのとのことですが、単独で有効な索引検索
ができるのか
・他のカラムとの組み合わせで索引検索が有効になるカーディナリティを
実現できるか。(c3,c4で索引を張った時など)
・このテーブルの更新頻度

もし、更新頻度が高く、c4単独でもそれなりに有効な索引検索ができるな
ら、(c1),(c2),(c3),(c4)の4つの索引を単独でつくり更新負荷を下げる
ことが必要かもしれません。

逆にカーディナリティが低いなら(c1),(c2),(c3),(c4)の4つのビットマッ
プ索引をつくり、検索時にマージして実行することも選択肢の一つだと
考えます。

中間的には、検索の頻度と有効度を勘案して複合索引つくるというもので
すね。

投稿日時 - 2008-04-15 13:33:15

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.1

それぞれの項目のカーディナリティは?(複合インデックスでも)
それがわからないと答えようがないのでは。

投稿日時 - 2008-04-14 20:54:21

補足

nora1962様、ご指摘有難う御座います。
前提条件が抜けておりました。
まだ不足条件等ありましたら、ご指摘ください。
カーディナリティは
C1 > C2 > C3 > C4
の順に高いこととします。
よろしくお願いいたします。

投稿日時 - 2008-04-15 01:36:05