2011-01-21 6 views
3

InnoDBには、プライマリ(クラスタ化)とセカンダリ(ピマーリインデックスキー付き)という2種類のインデックスがあります。InnoDBでセカンダリインデックススキャンがどのように機能しますか?

2次インデックスでインデックスされたスキャンフィールドを入力すると、質問が始まります。 InnoDBはセカンダリインデックスをスキャンし、条件を満たすレコードを1つずつ検索しますか? 2次索引で50回ヒットした場合、InnoDBは50回主索引を検索しますか?

答えて

11

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 

次のことが起こる:あなたはこのレイアウトしている場合

  1. B-Tree seekを使用し、InnoDBが見つかっ$some_value

  2. を保持しているcaのインデックスの最初のレコード次に、索引を1つずつ取り出して、それが見つかるまで最初のレコードは$some_valueより大きい。のみca(キー列)とid(行ポインタ)ので

  3. はテーブル自体にcbの値を見つける必要があるInnoDBインデックスに含まれています。

  4. インデックス内のレコードごとに、idの値をとり、そのテーブルを検索します。表は実際にはidのクラスタード・インデックスであるため、B-Tree検索が使用されています。このクエリを持っている場合

しかし、:

SELECT ca, id 
FROM a 
WHERE ca = $some_value 

、その後、すべてが右のインデックスから取得、および3ステップと4が実行されないことができます。クエリプランにはusing indexと表示されます。

2次インデックスに50ヒットがある場合、InnoDBは50回プライマリインデックスを検索しますか?

(上記のコメントに関して)はい

+1

確かに良い説明+1 – Harish

+0

ワーウ...恐ろしい説明.. – Sahal

関連する問題