InnoDBには、プライマリ(クラスタ化)とセカンダリ(ピマーリインデックスキー付き)という2種類のインデックスがあります。InnoDBでセカンダリインデックススキャンがどのように機能しますか?
2次インデックスでインデックスされたスキャンフィールドを入力すると、質問が始まります。 InnoDBはセカンダリインデックスをスキャンし、条件を満たすレコードを1つずつ検索しますか? 2次索引で50回ヒットした場合、InnoDBは50回主索引を検索しますか?
InnoDBには、プライマリ(クラスタ化)とセカンダリ(ピマーリインデックスキー付き)という2種類のインデックスがあります。InnoDBでセカンダリインデックススキャンがどのように機能しますか?
2次インデックスでインデックスされたスキャンフィールドを入力すると、質問が始まります。 InnoDBはセカンダリインデックスをスキャンし、条件を満たすレコードを1つずつ検索しますか? 2次索引で50回ヒットした場合、InnoDBは50回主索引を検索しますか?
InnoDBは二次索引をスキャンし、条件を満たすレコードを1つずつ検索しますか?
セカンダリインデックスに含まれていない列を選択した場合は、それをテーブル(クラスタードインデックス)から取得する必要があります。
CREATE TABLE a (id INT NOT NULL PRIMARY KEY, ca INT NOT NULL, cb INT NOT NULL, KEY(ca))
SELECT cb
FROM a
WHERE ca = $some_value
次のことが起こる:あなたはこのレイアウトしている場合
B-Tree seek
を使用し、InnoDB
が見つかっ$some_value
を保持しているca
のインデックスの最初のレコード次に、索引を1つずつ取り出して、それが見つかるまで最初のレコードは$some_value
より大きい。のみca
(キー列)とid
(行ポインタ)ので
はテーブル自体にcb
の値を見つける必要があるInnoDB
インデックスに含まれています。
インデックス内のレコードごとに、id
の値をとり、そのテーブルを検索します。表は実際にはid
のクラスタード・インデックスであるため、B-Tree
検索が使用されています。このクエリを持っている場合
しかし、:
SELECT ca, id
FROM a
WHERE ca = $some_value
、その後、すべてが右のインデックスから取得、および3
ステップと4
が実行されないことができます。クエリプランにはusing index
と表示されます。
2次インデックスに50ヒットがある場合、InnoDBは50回プライマリインデックスを検索しますか?
(上記のコメントに関して)はい
確かに良い説明+1 – Harish
ワーウ...恐ろしい説明.. – Sahal