• ベストアンサー

効果的なindexの設定方法

基本的なsqlはある程度わかりますが、DBの設計等はしたことがありません。 効果的なindexの設定方法を知りたいです。 「何を根拠にどのフィールドに実装すればよいのか」がわかりません。 URLでも結構ですので、教えてください。どうぞよろしくお願いいたします。

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

  • ベストアンサー
noname#4564
noname#4564
回答No.4

WHERE句で条件に指定する列なら何でもかんでもインデックスにすればよいかというと、そんなことはありません。何で読んだか忘れましたが、検索時のヒット率(該当件数 / 全体件数)が概ね10%程度まででないと、インデックスによるパフォーマンスの向上は期待できないそうです。 一例ですが、男女ほぼ同数の会員データで性別の列にインデックスを付けても効果は期待できない、ということです。(半数がヒットするので、全表走査と大差ない)

yumi-mika
質問者

お礼

皆さま回答ありがとうございました。まとめてお礼させていただきます。 >一例ですが、男女ほぼ同数の会員データで性別の列にインデックスを付けても効果は期待できない、ということです。(半数がヒットするので、全表走査と大差ない) 納得のいく説明をありがとうございます。勉強になりました。 今後ともよろしくお願いいたします。

その他の回答 (3)

  • Hk2001
  • ベストアンサー率48% (24/49)
回答No.3

他の方と意見は、変わらないのですが。 主キー(プライマリキー)は、一意になるように設定し なるべくコード管理が良いかと。 インデックスキーは、主キー以外での検索(WHERE)をする場合に その頻度によって決めるのがいいでしょう。 また、SQLはある程度わかるということでしたが、 WHERE文の書き方ひとつで検索スピードが変わります。 あと、インデックスキーを指定すると 登録時は、遅くなり インデックスキーの検索は、早くなります。 これは、データ件数が多くなるにしたがって顕著になります。

回答No.2

補足になりますが、インデックスはあまり設定しすぎるとその分メモリをくいますので、検索キーにするような項目に設定するのが良いと思います。 たとえば社員マスタなどの場合は社員番号というような感じですね。 ただ、DB設計の際、プライマリキーになっている項目はインデックス効果あるので、特に設定する必要は無いと思います。

  • aloop
  • ベストアンサー率23% (10/43)
回答No.1

インデクスというものは検索の性能を向上させるためのものですから、基本的には検索のキーとなる確度が高く、一意性が無い項目にインデクスを貼ると良いと思います。

関連するQ&A

  • 複数のDBでjoinする場合のindexについて

    複数のDBでJOINを多用しようと考えています。 その際のkeyは全てのDBに存在する同じフィールド(重複データのない固有のデータ)にしようと思っていますが、このフィールドにはindexを設定した方が良いのでしょうか? indexとprimaryキーの区別がよく分からないために、どのような設計にしたら良いのか困っています。

    • ベストアンサー
    • MySQL
  • ビューにインデックスを設定できませんか?

    SQL Server 2005 EXPRESS を使用しています。 トランザクションのテーブルにマスタを結合して表示するビューを作成しました。 実際に利用する時はトランザクションテーブルの主キーを検索に多用すると予想されるので、該当のフィールドにインデックスを設定したいのですが… Management Studio でインデックスを設定しようとするとエラーになります。 エラーメッセージは インデックス '' の作成に失敗しました。 (Microsoft.SqlServer.Express.Smo) ------------------------------ ADDITIONAL INFORMATION: Transact-SQL ステートメントまたはバッチの実行中に例外が発生しました。 (Microsoft.SqlServer.Express.ConnectionInfo) ------------------------------ ビュー 'View' に インデックス を作成できません。ビューにはスキーマがバインドされていません。 (Microsoft SQL Server, Error: 1939) となっています。まさにメッセージのとおりだとは思うのですが 「ビューにスキーマをバインドする」方法がわかりません。 どなたかご教授いただければ助かります。 よろしくお願いいたします。

  • ■検索時にINDEX(インデックス)がどう役立つのか?

    いつもお世話になっております。 MySQLのカテゴリにて質問をさせて頂きますが、このことに意味はありません。 SQLにおける、INDEXの考え方を知ることができれば良いなと思っております。 SQLについては初心者ですので、分かりやすく教えて頂けると助かります。 では、本題へ。 ------------- あるデータテーブルの検索速度を上げる方法として、 INDEXを設定することもその1つに挙げられるかと思いますが、 あるテーブルにおける、ある列(フィールド)に対しINDEXを設定した場合、 検索時、それはどう利用されるのでしょうか、というのが質問です。 例えば、 会員データベース ・会員番号:id ・年齢:age ※その他、複数のフィールドを持つ、とする。 上記の会員データベースにおいて、 CREATE INDEX idx ON tbl_member(id); という風に、tbl_memberテーブルに対し、 会員番号(id)をINDEXに設定したとします、 idは唯一無二の(ユニークな)データです。 この会員テーブルにおいて、 年齢(age)フィールドをもとに、40歳以上の会員を抽出(検索)したい場合、 INDEX(idが設定されている)はこの検索において、 どういう仕組みで活かされることになるのでしょうか? ageと無関係のidが、どう役に立つのか分からずにいる、ということです。 ネット上で色々調べたのですが、 あるフィールドをINDEXに設定した場合に、 それが検索時にどう活かされるのかについて説明されているページを 私は見つけることができませんでしたので、質問させて頂きました。 どうぞ、宜しくお願い致します。

    • ベストアンサー
    • MySQL
  • Accessのインデックスについて

    ACCESSにインデックスというのがありますが、いまいち使い方がわかりません。 検索などが早くなることはわかるのですが、一つのフィールドにインデックスを設定して、そのフィールドを並べ替えたり、検索をかけたりしても、特にインデックス設定前と変わらないのですが・・・ 設定方法や、インデックスの説明を書いてあるものは多いのですが、具体的な使い方が書いてあるものが少ないので、ぜひ、ご存知の方、インデックス設定後の使い方などを教えてください!

  • インデックスがすぐに壊れます…

    テーブル内の1フィールドにインデックスを設定していますが、内容が頻繁に更新されるせいか1日前後でインデックスが破損し、テーブルへのアクセスができなくなって困っています。 以下、詳細な状況です。 ------------------------------------------ (1)該当テーブルのレコード数は、約16,000,000件 (2)インデックスは[レコード更新日時]フィールドに設定しています。 (3)15分おきにデータの自動更新を行い、数百~数千件のレコードが更新されます。 その際、当然ながら[レコード更新日時]フィールドも更新されます。 (4)1日~2日に1度の割合で(3)の自動更新処理が異常終了します。 SQLのエラーコードはまちまちですが、重要度は決まって20前後の深刻なレベルです。 (5)(2)のインデックスを削除→再作成すると、(3)の自動更新処理は正常に行える (6)以下、(3)~(5)の繰り返し ------------------------------------------ 16,000,000件のうちの数千件といえば、0.1%にも満たない量です。そのために頻繁にインデックスの更新をしているうちにファイルがおかしくなるのでしょうか? (ひょっとしたら、インデックスの更新が完了しないうちに次の自動更新処理が実行されているのかもしれません) 同様のケースをご存知の方、いらっしゃいましたらどのように解決したかを教えてください。

  • インデックスサービスの効果

    インデックスサービスを使ってる人いますか? どんな時にどの程度の効果がありますか?

  • インデックスを調べる方法は?

    お世話になっております。 SQL Server2000で任意のテーブルのインデックスを調べたいのですが、 どうやったら良いのでしょうか? EXEC sp_indexes を実行すると、 サーバー '○○' は DATA ACCESS 用に設定されていません。 というエラーになります。

  • インデックスを使用して・・・

    おはようございます。 SQLServerのテーブルに格納された情報が多いので インデックスを用いて検索処理を早めたいと考えました。 ---テーブル構成-------------- name / varchar address / varchar age / int ---------------------------- name,addressフィールドにインデックスを指定したのですが、 インデックスを指定することにより検索するSQL文に なにか特別な書き方をしなくてはいけないのでしょうか? select name, address, age from test_table; ってSQLを記述しただけでは、 インデックスを作成する前と後では意味はないのでしょうか? 宜しくお願い致します。m(_ _)m

  • インデックスの順序

    Accessのテーブルにおいて、 インデックスを設定する画面で順序を変更しても反映されません。 どうすれば順序が変更できるようになるのでしょうか? また、インデックスを設定する順番において何か違いがあるのでしょうか? (現在とあるテーブルの3つのフィールドにそれぞれインデックスを張っていますが、 テーブルを表示したときに、何故か2番目のフィールドが基準に表示されています)

  • 欠番の取得方法

    いつも参考にさせて頂いています。 MySQL(OS:Windows)でDBを作っていますが、ある問題で詰まってしまいましたので識者の方の意見を伺えればと考えました。 問題は、インデックス(1で開始され、あとは+1ずつ増加)をキーとしたデータが登録されているテーブルがあります。 このテーブルのデータは削除・追加が行われます。削除の際は当然そのインデックスが欠番となり、追加時は欠番があればそちらを使用したいのですが、欠番を求める巧いSQLが思い浮かびません(パッと考え付くのは欠番テーブルを作る事位です…)。 如何せんDB・SQL経験が浅いためDB設計の考え方がおかしいのかもしれません。この点も含め上記問題の解決方法のヒントを教えて頂ければ幸いです。

    • ベストアンサー
    • MySQL