• ベストアンサー

MySQLのUNIQUE INDEXとINDEX

MySQLのUNIQUE INDEXとINDEXの使い分けで質問があります。 UNIQUE INDEXは、社員番号や学籍番号など重複がないものに対して使われ、 INDEXは名前のように重複が想定されるものに対して使われるのでしょうか? また、複数のカラムに同一のインデックスをつける場合、 CREATE INDEX idx_名前 ON 社員(氏,名) と言う感じになりますが 例えばこんなコード CREATE INDEX idx_名前 ON 社員(氏) and CREATE INDEX idx_名前 ON 社員(名) これはエラーになるんでしょうか?

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

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

  • ベストアンサー
  • int3
  • ベストアンサー率34% (65/190)
回答No.1

>UNIQUE INDEXは、社員番号や学籍番号など重複がないものに対して使われ、 >INDEXは名前のように重複が想定されるものに対して使われるのでしょうか? INDEXは検索のキーとして利用したいものに設定します。 UNIQUE INDEXはその中でも、データが一意になるものにつけます。 (こうしておけば不慮の事故を回避できます。) >また、複数のカラムに同一のインデックスをつける場合、 >CREATE INDEX idx_名前 >ON 社員(氏,名) >と言う感じになりますが 複数のカラムに同一のインデックスをつけるというより、 氏、名という順で行を検索しやすいようにデータをつくっています。 なので、このインデックスでは select * from 社員 where 氏='福澤' and 名='諭吉'; としたときにインデックスが使えて行を高速に検索できますけど、 select * from 社員 where 名='諭吉'; ではこのインデックスが使えず行の検索が遅くなります。 >これはエラーになるんでしょうか? インデックスはテーブルにテーブルに対して同じものは生成できないので、 idx_名前というインデックスは2つ作成できません。 仮に、idx_名というものをつくれば、 select * from 社員 where 名='諭吉'; 上記ではできなかったこれも行を高速に検索できるようになりますが、こういう検索をする処理がないのであれば、そもそもインデックスをつくるだけ無駄になってしまいます。

関連するQ&A

  • UNIQUEをつけたときのINDEXテーブル

    テーブル作成時、カラムにUNIQUEをつけると自動でインデックステーブルが作成されますが、このインデックステーブルで、通常のselect検索も早くなるのでしょうか? 具体的には、ユニークなカラムidを持つテーブルtableA create table tableA( id INTEGER UNIQUE, some_column INTEGER ); を作ったあとで、そのidにあらためて CREATE INDEX id ON tableA (id); と、インデックスを張る必要があるのでしょうか。 よろしくお願いします。

  • インデックスのまとめ貼りと個別貼り

    いつもお世話になっております。 インデックスを貼るときに主キーのようにまとめて 設定することができますよね。 CREATE INDEX Idx原価 ON T原価 (商品名,発注番号); 上記のようにまとめて設定するのと CREATE INDEX Idx原価_商品名 ON T原価 (商品名); CREATE INDEX Idx原価_発注番号 ON T原価 (発注番号); このように2つに分けて貼るのでは意味は違ってくるのでしょうか? 商品名と発注番号の検索が別々に行われる場合は 分けて作成したら良いのでしょうか?

  • インデックス名の重複(MySQL5.1+Windows2008)

    インデックス名の重複(MySQL5.1+Windows2008) テーブルを次のSQLでコピーしました。 mysql>create table 新テーブル名 like 元テーブル名; インデックスもコピーされたのですが、インデックス名が重複します。 これは、問題ないのでしょうか? 新テーブルにも、同じインデックスを張りたいので、問題がなければこのままにしておきたいと思っています。 よろしくお願いします。

    • ベストアンサー
    • MySQL
  • 効率的なインデックスのつけ方は?

    効率的なインデックスのつけ方は? MYSQLでのインデックスのつけ方をご教授して頂けますでしょうか? ・データ数とかその他もろもろにもよるかと思いますが、一般的に考えてってことでよろしくお願いいたします。 以下のようなテーブル定義があったとします。 CREATE TABLE TEST_TBL ( C1 VARCHAR(10) NOT NULL, C2 VARCHAR(10) NOT NULL, C3 VARCHAR(10) NOT NULL, C4 VARCHAR(10) NOT NULL, PRIMARY KEY (C1) ) 検索条件としては、 ・(C1) ・(C2) ・(C3) ・(C4) ・(C1,C2) ・(C1,C3) ・(C1,C4) ・(C2,C3) ・(C2,C4) ・(C3,C4) ・(C1,C2,C3) ・(C1,C2,C4) ・(C1,C3,C4) ・(C2,C3,C4) ・(C1,C2,C3,C4) と言うような、すべての場合の条件があるとします。 それぞれの検索条件の頻度は同程度とします。 この場合、どのINDEXとどのINDEXを作成するがベターなのでしょうか? 1. CREATE INDEX TEST_IDX1 ON TEST_TBL (C1); 2. CREATE INDEX TEST_IDX1 ON TEST_TBL (C2); 3. CREATE INDEX TEST_IDX1 ON TEST_TBL (C3); 4. CREATE INDEX TEST_IDX1 ON TEST_TBL (C4); 5. CREATE INDEX TEST_IDX1 ON TEST_TBL (C1,C2); 6. CREATE INDEX TEST_IDX1 ON TEST_TBL (C1,C3); 7. CREATE INDEX TEST_IDX1 ON TEST_TBL (C1,C4); 8. CREATE INDEX TEST_IDX1 ON TEST_TBL (C2,C3); 9. CREATE INDEX TEST_IDX1 ON TEST_TBL (C2,C4); 10.CREATE INDEX TEST_IDX1 ON TEST_TBL (C3,C4); 11.CREATE INDEX TEST_IDX1 ON TEST_TBL (C1,C2,C3); 12.CREATE INDEX TEST_IDX1 ON TEST_TBL (C1,C2,C4); 13.CREATE INDEX TEST_IDX1 ON TEST_TBL (C1,C3,C4); 14.CREATE INDEX TEST_IDX1 ON TEST_TBL (C2,C3,C4); 15.CREATE INDEX TEST_IDX1 ON TEST_TBL (C1,C2,C3,C4);

    • ベストアンサー
    • MySQL
  • Mysqlのconstraintについて教えてください (難題)

    回答者がつかなかったので再度。 Q1.単順にKEY指定するのとどこが違うのですか? show indexで見た限り、下記の(1)と(3)の違いが分かりません。 Q2.constraint_nameはどこに行ってしまったのですか? show indexで見ると、unique(it1)で指定した項目it1がそのままインデックス名になります。 constraint_nameで指定した名前はどこに行ったのでしょうか? (1)constraintで定義、インデックス名を指定。 mysql> create table t1 (it1 tinyint(1),constraint constraint_name unique(it1)); (2)UNIQUE KEYで定義、インデックス名を指定。 mysql> create table t2 (it1 tinyint(1),UNIQUE KEY UNIQUE_KEY_NAME (it1)); (3)UNIQUE KEYで定義、インデックス名=Key項目名。 mysql> create table t3 (it1 tinyint(1),UNIQUE KEY it1 (it1));

  • UNIQUE KEY user_name_inde

    サンプルのCREATE TABLE文 の中に、 UNIQUE KEY user_name_index(user_name) とあったのですが、意味を教えてください。  自分で調べた限りは、UNIQUEというのはあったのですが、  UNIQUE KEY が見つかりませんでした。  UNIQUE KEY は、UNIQUEと同義なのでしょうか?  あるいは、こういう書き方があるのでしょうか?  また、CREATE TABLEの中で、user_nameカラムを作成しているのですが、  user_name_index(user_name)では、何をしているのでしょうか?  user_name_indexと別の名前でUNIQUE KEYに設定しているのでしょうか?  それとも、_indexとついてるので、  この書き方だけで、ユニークインデックスなるものにしているのでしょうか?

    • ベストアンサー
    • MySQL
  • SQLのINDEX名

    素朴な疑問ですが、教えてください。 SQLのcreate index構文は「create index idx on table(id);」ですが、 そもそも、なぜindex名をこちらが名前を指定するようになっているのでしょうか。 別にシステム側で決めても良い気がします。delete index するときも 列名を指定する仕組みにして、列名に張られたindexを削除する仕組みにすればいいのにと 思います。 よろしくお願いします。

  • MySQLで0以外をユニークにする制約をかけたい

    MySQLで主キーのidの他にfoofoo_idというint型カラムがあります。 このfoofoo_idを0以外をユニークしたいのですが可能でしょうか? MySQLのバージョンは8.0.21です。 検索をかけたところNULL以外をユニークにするという記事を見つけたので、下記のようにNULLではなく0にしてみましたが、そもそもWHEREの部分がダメのようで通りませんでした。 CREATE UNIQUE INDEX uq_foofoo_id ON `hogehoge`.`sample`(foofoo_id) WHERE foofoo_id IS NOT '0' ;

    • ベストアンサー
    • MySQL
  • インデックスの削除と、インデック名のつけ方について

    PostgreSQL8.2.24を使っています。 インデックスの削除と、インデック名のつけ方についてお聞きしたいです。 まず、削除ですが、create index tbl_fld_key on tbl (fld); としたものは、drop index tbl_fld_key;で削除できますが、 create tbl ( fld integer, unique key (fld) ); としたものは、drop index tbl_fld_keyで削除できません。 インデックス名は\diコマンドで表示されている tbk_fld_keyです。 メッセージは次のとおりです。 db =# drop index tbl_fld_key; ERROR: cannot drop index tbl_fld_key because constraint tbl_fld_key on table tbl requires it HINT: You may drop constraint tbl_fld_key on table tbl instead. あと、PostgreSQLのインデック名の規則について インデックス名を見ただけで判断できるように作られるようですが PRIMARY KEY テーブル名_フィールド名_pkey UNIQUE    テーブル名_フィールド名_key 重複可    テーブル名_フィールド名_??? <<--- この部分が知りたいです。

  • MySQLのインデックスについて

    MySQLのインデックスについて 検索画面で検索条件となるテキストフィールドが5つ(仮に住所、年齢、名前、電話番号、メールアドレス)あった場合全てのテキストに値を入力すると WHERE 住所 = 'XXXXX' AND 年齢 = XX AND 名前 = 'XXXX' AND 電話番号 = XXXX AND メールアドレス = 'XXXX' (Xは入力値) といった具合のSQL文になります。 最低でもどこかのテキストフィールドの1つが必須入力の場合、インデックスを貼るのであれば5つのフィールドのあらゆる組み合わせのインデックスを作成しなければならないので膨大なデータ量(1億件)がある場合はインデックスサイズも大きくなりますし、既に存在するデータに対してインデックス作成するのでそれだけで相当な時間がかかります。 しかしインデックスがないと検索に相当な時間がかかるのでインデックスはどうしても必要です。 こういった場合の対処法を教えてください。 MySQLはMyIsamを使ってます。 よろしくお願いします。

    • ベストアンサー
    • MySQL