![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
20万件レコードのあるテーブルに、インデックスを張ると
INSERTが遅くなるので、WHERE句で検索する項目のどれに
インデックスを張るか悩んでいます。
インデックスはパターンが多い程、張った場合に
検索速度が向上すると理解しているのですが正しいでしょうか?
であれば、下記1.だけは貼ろうと思っているのですが・・
1.カラムに入るデータが殆どバラバラのVARCHAR(30)
2.カラムに入るデータは10万パターンのINT型
3.カラムに入るデータは1万パターンのINT型
4.カラムに入るデータはdatetime型
インデックスを張る事でINSERT速度が何%ぐらい下がるでしょうか?
よろしくお願いします。
No.1ベストアンサー
- 回答日時:
>インデックスはパターンが多い程、張った場合に検索速度が向上する
>と理解しているのですが正しいでしょうか?
よく例に挙がるのが、性別ですね。男、女の2種類しかデータがないので、特にB-TREE構造のインデクスの場合は、性能向上は期待できません。
インデクスを定義しても、インデクスを有効利用できる検索条件でないと、意味がありません。
インデクスを有効利用できる条件は、「=」条件、範囲条件、LIKEの前方一致(列名 LIKE 'ABC%')等です。
MAXやMIN、COUNTなどの集計(集合)関数でも、インデクスがあれば活用できます。
また、group by、order by、distinctでも、インデクスにより、ソート抑止することが可能です。
>であれば、下記1.だけは貼ろうと思っているのですが・・
>1.カラムに入るデータが殆どバラバラのVARCHAR(30)
>2.カラムに入るデータは10万パターンのINT型
>3.カラムに入るデータは1万パターンのINT型
>4.カラムに入るデータはdatetime型
これらの列に、上述のような検索条件を指定したり、order by指定したりするのでしょうか?
もしそうなら、この4列それぞれにインデクスを付けた方がいいのでは?3でも、平均の重複数は20件なのですよね?
また、必ず「列名1=値1 and 列名2 between 値2 and 値3」のように、複数の列の組み合わせで検索条件を指定するなら、列1や列2の単一列でなく、(列1、列2)で構成する複数列インデクスの定義をした方がいいでしょう。
>インデックスを張る事でINSERT速度が何%ぐらい下がるでしょうか?
インデクスを付けることによりオーバヘッドが発生するのは、insertだけでなく、delete、update(インデクスの構成列更新時)もです。
何%といった定量的な値は、出せません。
簡易的な考え方としては、(データ部+インデクス部×インデクス本数)のI/O要求が出ると考えればいいでしょう。インデクスが4本なら、データの更新を加えて、5回のI/O要求が出ると考えてください。
しかし、厳密には、B-TREEインデクスのインデクス分割が発生すると、+1~2回程度のI/O要求が増えます。
また、データベースのI/Oバッファ上に更新対象のデータやインデクスのページがあると、I/O要求回数に比べ、実I/O回数はもっと少なくなります。
お礼が遅くなってすみません。
複合インデックスやディスクI/O。大変勉強になりました。
ありがとうございます。平均の重複数ですが、データの型にもよりそうですが、どのくらい重複している場合インデックスを張るべきなのでしょうか? 全部バラバラの場合、インデックスを張らない方が良いのでしょうか?
よろしくお願いします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・ゆるやかでぃべーと タイムマシンを破壊すべきか。
- ・「I love you」 をかっこよく翻訳してみてください
- ・歩いた自慢大会
- ・許せない心理テスト
- ・字面がカッコいい英単語
- ・昔のあなたへのアドバイス
- ・かっこよく答えてください!!
- ・あなたが好きな本屋さんを教えてください
- ・スタッフと宿泊客が全員斜め上を行くホテルのレビュー
- ・【大喜利】【投稿~8/27】 こんなガソリンスタンド二度と来るか!なぜそう思った?
- ・これ何て呼びますか Part2
- ・人生で一番思い出に残ってる靴
- ・【お題】動物のキャッチフレーズ
- ・【お題】甲子園での思い出の残し方
- ・ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
- ・「それ、メッセージ花火でわざわざ伝えること?」
- ・自分用のお土産
- ・人生で一番お金がなかったとき
- ・一番好きなみそ汁の具材は?
- ・泣きながら食べたご飯の思い出
- ・ちょっと先の未来クイズ第1問
- ・ゴリラ向け動画サイト「ウホウホ動画」にありがちなこと
- ・初めて自分の家と他人の家が違う、と意識した時
- ・単二電池
- ・チョコミントアイス
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
MySQLのKey属性「MUL」について
-
ユニーク制約とユニークインデ...
-
オートインクリメントについて
-
INDIRECT関数の代替方法は?
-
DBの定義のサイズを大きくし過...
-
group byで最後のレコードを抽...
-
MYSQLで全てのカラムから検索す...
-
DBエラーの意味
-
[MySQL]LOAD DATA INFILE一部レ...
-
一部のカラムでdistinctし全て...
-
now()かCURRENT_TIMESTAMPか
-
テーブルの列数を調べたい
-
文字列のカラムを数字と比較したい
-
smalldate型へnull値の代入
-
WHEREなどの条件が多い場合、ど...
-
GREATESTで NULLをスルーする方...
-
エクセルかワードで家系図を作...
-
波形データを格納するデータベース
-
SELECT文で、指定カラム以外の...
-
type date にnullをinsert
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ユニーク制約とユニークインデ...
-
複数カラム検索で、LIKE "%検索...
-
MySQLのKey属性「MUL」について
-
SQL Server Management Studio...
-
インデックスを張るべき項目に...
-
削除ふらぐ
-
MySqlでのデータソートについて
-
インデックスについて
-
大量の項目を対象に効率的に検...
-
オートインクリメントについて
-
INDIRECT関数の代替方法は?
-
DBの定義のサイズを大きくし過...
-
一部のカラムでdistinctし全て...
-
GREATESTで NULLをスルーする方...
-
now()かCURRENT_TIMESTAMPか
-
LIKEの右側にカラムを指定でき...
-
テーブルの列数を調べたい
-
SQLServerでNULLを挿入したいです
-
MYSQLで全てのカラムから検索す...
-
SELECT文で、指定カラム以外の...
おすすめ情報