MySQLの複合インデックス設定に関する質問

このQ&Aのポイント
  • MySQLの複合インデックスの設定に関して質問させて頂きます。検索条件に3つのカラムを使用して検索をかけているSELECT文があります。データの件数は100万件ほどあります。
  • カラム「a」「c」は、0と1のみが格納されたカラムで、頻繁に更新されます。カラム「b」は、同じ値が入ることがありますが、ほぼユニークな文字列が格納されます。
  • 複合インデックスを作成するべきか、または単独インデックスを作成するべきかについて、良い方法があれば教えて頂きたいです。
回答を見る
  • ベストアンサー

複合インデックスの設定に関して

MySQLの複合インデックスに関して質問させて頂きます。 現在検索条件に3つのカラムを使用して検索をかけているSELECT文があります。 データの件数は100万件ほどあるとします。 【例】 「SELECT * FROM test WHERE a = '1' AND b = 'xxxxx' AND c = '1';」 カラム「a」「c」は、0と1のみが格納されたカラムで、頻繁に更新されます。 カラム「b」は、同じ値が入ることがありますが、ほぼユニークな文字列が格納されます。 上記のような場合、インデックスは ・「a,b,c」の全てを設定した複合インデックスを作成するべきか。 ・cは頻繁に更新されるので、「a,b」のみの複合インデックスを作成するべきか。 ・aも同じく頻繁に更新されるので、WHERE句の検索順をbを先に持ってきて、「b」のみの単独インデックスを作成するべきか。 一概にこうだという答えは無いかもしれませんが、何か良い方法があれば教えて頂けると幸いです。 また、質問に不備な点がございましたら、ご指摘お願いいたします。

  • MySQL
  • 回答数1
  • ありがとう数1

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

  • ベストアンサー
  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.1

同じtestテーブルで管理しているなら複合インデックスで十分では? explainで検証しながらやってみるしかないでしょう bが「ほぼユニーク」であるならbで先行して 絞り込みをしてサブクエリをつかって処理する手もないことはないかと。 できれば「ほぼユニーク」をなんらかの形で「ユニーク」に絞り込む 方法を考えた方がいいかもしれませんね

non05410
質問者

お礼

今回はbを先行して単一インデックスを設定することで対応しました。 回答頂きありがとうございます。

関連するQ&A

  • 検索条件が複数の場合のインデックスの張り方

    Mysql5.0 + ASP.NETで開発中です。 サーバーはWindows2003サーバーです。 とある検索サイトを作っていますが、1テーブルのフィールド数が80くらいあります。 また、レコード数は常時100万件程度です。 このテーブルの検索を行うときに、ユーザーが任意の検索条件を設定できるような画面なのですが、実際に検索に使用されるフィールド数は最大で10です。 例えば、where a = 999 and b = 999 や where a = 999 and c = 999 and f = 999 や where b = 999 and d = 999 and f = 999 and g = 999 など、where句で使用されるフィールドがユーザーの指定により常に異なります。(999は任意の値です) ORDER BYに使用されるフィールド数は3です。 現状ではインデックスは張っていないため、かなり検索速度が遅いため、インデックスを張りたいのですが、どのような張り方がいいのかがわかりません。 このような場合、インデックスを張る方法として、どの方法が一番よいのでしょうか? 1.検索に使用される10つのフィールドに1つずつ張ればよい 2.検索に使用される10つのフィールドとソートに使用される3つのフィールドに1つずつ張ればよい 3.where句の組み合わせを全て考えて複合インデックスを張る必要がある。 4.その他 また、80フィールドのテーブルを適当に4つくらいに分けて、検索時に結合すれば早くなったりするものでしょうか?

  • データベースのインデックスについて教えてください(複合インデックス)

    インデックスについて教えてください。 データベースの項目にFirstNameとLastNameがあり、 AND検索のためにFirstNameとLastNameに複合インデックスを 設定しました。 でもFirstNameとLastNameのそれぞれ単独でも検索を するような場合、FirstNameとLastNameの複合インデックスに 併せて、それぞれ単独のインデックスを作成する必要が あるものでしょうか? よろしくお願いいたします。

  • エクセルで複合検索

    エクセルなのですがvlookup関数で複合検索をしたいのですができません。 A表 A B C 1 a1 b1 c1 2 a2 b2 c2 3 a3 b3 c3 という表があり B表 a b c 1 11 12 13 2 21 22 23 3 31 32 33 というところから引っ張りたいのですが sql で書くと select B.c from A,B where A.a=B.a and A.b=B.b になります。 エクセルでできないものでしょうか?

  • WHERE句の条件の記述の順序

    PRIMARY KEYとINDEXがテーブルに設定されている場合、 検索条件に記述する順番はどのようになるのでしょうか? 下記のテーブルがあり、SELECT文をつくろうと 考えています。 テーブル:foo 項目  PRIMARY KEY  INDEX ----------------------------------- a 1 b 2 1 c 3 d 2 (1)PRIMARY KEYを優先してWHERE句の順番を決める↓ SELECT * FROM foo WHERE a = "AAA" AND b = "BBB" AND c = "CCC" AND d = "DDD" (2) それともINDEXが設定されている項目を先に記述する↓ SELECT * FROM foo WHERE b = "BBB" AND d = "DDD"   AND a = "AAA" AND c = "CCC" (1)と(2)ではどちらの性能がよいのでしょうか?

  • IN 句ではインデックスが使用されない?

    環境はDB2で現在チューニング作業を担当しています。 ここでWHEREに COL1='AAA' AND COL2='BBB' AND COL3 IN ('CCC','DDD') とある時、COL1、COL2、COL3を含む複合列インデックスを作成したのですが インデックスが使われません。 ※テーブルスキャンになります 上司はIN句があるから仕方ない。。と言うのですがどうも腑に落ちません。 でも確かにIN句をコメントアウトしCOL1、COL2のみで検索すると インデックスを使います。うーんという感じです。 お手数ですがご意見お願いします。。

  • インデックスを張るべき項目について

    20万件レコードのあるテーブルに、インデックスを張ると INSERTが遅くなるので、WHERE句で検索する項目のどれに インデックスを張るか悩んでいます。 インデックスはパターンが多い程、張った場合に 検索速度が向上すると理解しているのですが正しいでしょうか? であれば、下記1.だけは貼ろうと思っているのですが・・ 1.カラムに入るデータが殆どバラバラのVARCHAR(30) 2.カラムに入るデータは10万パターンのINT型 3.カラムに入るデータは1万パターンのINT型 4.カラムに入るデータはdatetime型 インデックスを張る事でINSERT速度が何%ぐらい下がるでしょうか? よろしくお願いします。

    • ベストアンサー
    • MySQL
  • Indexについて

    初心者です。Indexについての質問です。 1.Where 注文No=nnn と 2.Where 注文No=nnn and 明細No=mmm といった問い合わせを行うため、二つのIndexを作成しました。 index-A:注文No index-B:注文No,明細No 「1.Where 注文No=nnn」の問い合わせは、 index-A、index-Bのどちらでもパフォーマンスは同じでしょうか? であれば、index-Aを消したいので・・・ よろしくご教授くださいませ。

  • Oracleでルールベースでの複合索引

    数十万件のデータをバッチ処理を行っているのですが、パフォーマンスが悪く困っています。 その原因となりそうな部分について質問します。 テーブルAに複合索引を作ります。 create unique index uk_A on A(AA,AB,AC,AD); このテーブルに検索をかけます。そのときにWhere句に書く列の順序は、パフォーマンスには関係ないのでしょうか? select max(AD) from A where AA=1 and AB=2 and AC=3; としたときと select max(AD) from A where AC=3 and AB=2 and AA=1; としたときの、パフォーマンスの違いです。 このバッチ処理の中で、Aのテーブルに多数のデータを追加するために、コストベースにはできません。また、このSQL文は、プロシージャの中で使用しています。 範囲検索の場合のことは、講習でもあったのですが、等価結合のことは出てきませんでした。 どなたかご存知の方宜しくお願いします。

  • 表領域のパーティション分割時のINDEXについて

    表領域のパーティション分割時のINDEXについて質問があります。 下記の様な構成の時、グローバルINDEXとローカルINDEXはどの様に張るべきでしょうか。 今現在は、下記の<現状の構想>の通りにINDEXを作成しようかと考えています。 しかしながら、検索時に項目B&項目Cのwhere句で効率よく領域を選択(検索)できるのか悩んでいます。 機器の問題で実際に試す事ができず、悶々としています。 情報の不足がございましたら、ご指摘下しさい。 ご回答お待ちしています。 <前提> ・表Aへのアクセス:where 項目B = n and 項目C = m ・表Aのレコード数は8000万程度 <現状での構想> ・表Aの領域をパーティション分割(項目Bのハッシュ) ・グローバルINDEXは項目B&項目C ・ローカルINDEXはなし

  • Access結合後の短いテキスト型のインデックス

    Accessの検索にて、テーブルA LEFT JOIN テーブルB で外部結合し、 WHERE句でテーブルBの短いテキスト型を抽出条件にすると、検索が遅くなります。 【テーブル定義】 テーブルA( ・年月日(日付/時刻、重複ありインデックス) ・コード(短テキスト、重複ありインデックス) ・属性あ(短テキスト、重複ありインデックス) ・属性い(短テキスト、重複ありインデックス) ) テーブルB( ・コード(短テキスト、主KEY) ・属性う(短テキスト、重複ありインデックス) ・属性え(数値、重複ありインデックス) ) 【件数】 テーブルA:15万件 テーブルB:500件 =====SQLここから===== SELECT * FROM テーブルA LEFT JOIN テーブルB ON テーブルA.コード = テーブルB.コード WHERE 属性あ IS NULL AND 属性い = 'あああ' AND 属性う = 'アアア' AND 属性え = 1 GROUP BY 年月日、 属性う =====SQLここまで===== この検索SQLは遅い(1分30秒くらい)のですが 『AND 属性う = 'アアア'』を削除すると 10秒くらいに速くなります。 ”属性う” のインデックスが効いてないように見えるのですが どのようにチューニングしたら速くなるでしょうか? エクセルからLAN越しにDAO接続してSQL実行してます。 AccessはOffice365(バージョン1902)です。