MySQLを使用してます。
とあるテーブルにおいて
PRIMARY KEY (id
)
と設定されているテーブルに、
INDEX(id
, delete_flag
)
のようなインデックスを貼ることは、パフォーマンス上意味があるのでしょうか?
id カラムがユニークである以上、主キーの方のインデックスのみで
行を特定できるので、上記のインデックスは追加するのは不要だと思いました。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答1件
0
ベストアンサー
その手のインデックスはカバリングインデックスとして使えます。
例えば次のようなテーブルがあったとして、
lang
1create table t ( 2 id int not null primary key, 3 delete_flag boolean not null, 4 str char(10) 5);
id と delete_flag のみを select するSQLを explain すると次のようになります。
mysql> explain select id, delete_flag from t \G *************************** 1. row *************************** id: 1 select_type: SIMPLE table: t type: ALL possible_keys: NULL key: NULL key_len: NULL ref: NULL rows: 1 Extra: NULL
これはつまりテーブル全体が読まれています(不要な str
フィールドも含めて)。
次の通りにインデックスを作成すると、
lang
1create index idx__id__delete_flag on t (id, delete_flag);
explain は次のように変わります。
mysql> explain select id, delete_flag from t \G *************************** 1. row *************************** id: 1 select_type: SIMPLE table: t type: index possible_keys: NULL key: idx__id__delete_flag key_len: 5 ref: NULL rows: 1 Extra: Using index
Extra
に Using index
とありますが、これはインデックスのみで SQL が完結できたためテーブルそのもの(=主キー)は読まなかったという意味です。
テーブルそのもの(=主キー)よりもセカンダリインデックス(主キーじゃないインデックス)の方がサイズは小さいので、後者の方が良い性能がでます。
もちろん、セカンダリインデックスだけで SQL が完結できなければならないので、次のように SQL で str
フィールドも使っているとカバリングインデックスにはなりません。
lang
1mysql> explain select id, delete_flag from t where str = 'ore' \G 2*************************** 1. row *************************** 3 id: 1 4 select_type: SIMPLE 5 table: t 6 type: ALL 7possible_keys: NULL 8 key: NULL 9 key_len: NULL 10 ref: NULL 11 rows: 1 12 Extra: Using where
投稿2014/12/18 00:48
総合スコア4514
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2015/03/04 16:31