- ベストアンサー
複数のインデックスについて
以下のようなテーブルで、 ------------------------- テーブル名:hoge カラム1:name(名前) カラム2:age(年齢) カラム3:job(職業) INDEX age(age) ------------------------- 今現在、年齢で検索することが多いため、ageにIndexを張っているのですが、職業でも検索したいと思っています。 (今現在、職業で検索するとIndexが関係ないためか低速です。) この場合、「ALTER TABLE hoge ADD INDEX job(job)」で大丈夫でしょうか? インデックスが良くわかってないのですが、こうすると、今の年齢用のインデックスとは、全く別のインデックスが作成されると思って良いのでしょうか? (年齢のインデックスの下に職業のインデックスが作成され、職業で検索しても、結局、年齢のインデックスをまたぐため低速になる、なんてことは無いのでしょうか?) よろしくお願いします。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
別途インデックスを設定するのであれば完全に独立したインデックスになります。 ただしインデックスは、なんとなく設定すればベストチューニングになる わけではありません。 EXPLAINなどで調査しながら、特徴にあったインデックスをはると 格段にスピードが違います。よくお調べになるとよろしいかと。
その他の回答 (1)
- chukenkenkou
- ベストアンサー率43% (833/1926)
インデクスはデータの絞込み以外に、ORDER BY、GROUP BY、DISTINCT等を指定することで発生するソート抑止にも利用されます。 例えば、次のような使い分けをします。 (1)ageやjobを、単独で「=」や範囲検索する →age、jobの個々にインデクスを定義 (2)ageやjobで条件指定した上で、ageやjobでorder by等を指定する →age、jobの複数列インデクスを定義する 例 (1) select * from hoge where age between 21 and 30 →index(age)があればいい (2) select * from hoge where job='xxx' and age between 21 and 30 →index(job,age)がベターな可能性あり(重複度合いなどで違ってくる可能性あり) (3) select * from hoge where job='xxx' order by job,age →index(job,age)がベター。 「where job='xxx' order by age」のように、order bayでインデクスの先頭列jobがないと、インデクスを利用してソート抑止できない点は注意 実際には、母体データ件数、実際の検索対象件数などでRDBMSの解釈が違ってくるので、EXPLAINで確認してください。