![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?8acaa2e)
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で質問しましょう!
似たような質問が見つかりました
- MySQL PHPとMySQLを使った掲示板の作り方 1 2022/06/02 13:00
- MySQL MySQLのテーブル作成で 自信がありません。 2 2022/08/28 05:35
- SEO 検索エンジンにインデックスされない 3 2023/02/20 08:59
- PostgreSQL 列が存在しないと言われる 2 2023/02/10 18:33
- MySQL あと、MySQLの文字コードはutf8 気になりますね 1 2022/12/01 07:22
- Outlook(アウトルック) outlookで検索に引っ掛かりません。 5 2022/08/25 12:00
- その他(プログラミング・Web制作) pandasでまとめてインデックスを削除するにはどうすればいいですか? たとえば、以下のプログラムで 1 2022/07/31 23:09
- SEO Googleで会社名を入れて検索するとホームページが表示されるようにしたい 4 2022/09/06 23:36
- Excel(エクセル) マクロVBAのフォルダ階層別で検索の方法 4 2022/04/03 23:23
- MySQL SQLについて教えて下さい。 SELECT分で、あるカラムにある日付の 半年先のデータを取って来たい 3 2022/12/07 22:28
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
SQLです教えてくださいお願いし...
-
SQLです教えてくださいお願いし...
-
テーブル名が可変の場合のクエ...
-
BGMを教えてほしいです!
-
クエリを教えてください select...
-
utf8bomとutf8mb4の違いがいま...
-
SQLで漢字名称を都道府県や市区...
-
SQLです教えてくださいお願いし...
-
下記の問合せを行うクエリを、P...
-
はもうダメですか?
-
ここでは「サブクエリ」必要な...
-
「総降水量が100mm以上になる...
-
SQLあってますか?こう?
-
SQLです!!教えてください。あ...
-
SQLです!!教えてください。あ...
-
SQLです!!教えてください。
-
SQLです。下記の問合せを行うク...
-
Xサーバーのバックアップで全サ...
-
「都道府県の面積の大きい順に...
-
SELECT my_items.item_name, ca...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ユニーク制約とユニークインデ...
-
オートインクリメントについて
-
MySQLのKey属性「MUL」について
-
複数カラム検索で、LIKE "%検索...
-
SQL Server Management Studio...
-
大量の項目を対象に効率的に検...
-
インデックスについて
-
UPDATEつてインデックス貼って...
-
MySQLのインデックスについて
-
テーブル設計について。
-
1000件以下の場合はカラム数に...
-
MySqlでのデータソートについて
-
インデックス作成について
-
文字検索 (LIKE)を使った場合
-
複合インデックスの設定に関して
-
インデックスを張るべき項目に...
-
検索エンジン検索結果から削除...
-
INDIRECT関数の代替方法は?
-
DBの定義のサイズを大きくし過...
-
SELECT文で、指定カラム以外の...
おすすめ情報