ほとんどのMySQLのインデックス(PRIMARY KEY
、 UNIQUE
、 INDEX
、および FULLTEXT
)が中に保存されている B-木。例外:空間データ型のインデックスは、R-木を使用します。 MEMORY
テーブルもサポートして ハッシュインデックスを。 InnoDB
用途反転リストの FULLTEXT
インデックス
Bツリー
データベースインデックスの使用に人気のあるツリーデータ構造。構造は、高速完全一致のルックアップ(オペレータに等しい)および範囲(例えば、より小さい、より大きい、及び可能、常にソート保たれる BETWEEN
演算子)。このタイプの索引は、次のようなほとんどのストレージエンジン、のために利用可能である InnoDB
と MyISAM
。
Bツリーノードは多くの子供を持つことができるので、Bツリーは、ノードあたり2人の子供に限定される二分木、同じではありません。
対照的 でのみ利用可能であるハッシュインデックス、 MEMORY
ストレージエンジン。 MEMORY
ストレージエンジンはまた、B-treeインデックスを使用することができ、あなたはB-treeインデックスを選択する必要があり MEMORY
、いくつかのクエリは範囲演算子を使用する場合のテーブル。
B-treeインデックス:正規表現で使用できる列の比較 、、 、 、 、 またはオペレーター。 引数が場合は定数文字列の先頭にワイルドカードではなく、インデックスものために使用することができる比較。=
>
>=
<
<=
BETWEEN
LIKE
LIKE
ハッシュインデックス:だけ速く、等価比較のために使用。
MySQLはにインデックスを使用します。
-
WHERE
クイック 検索句の一致する行。 -
検討から行を排除します。あなたが複数のインデックスの間で選択することができた場合は、MySQLは多くの場合、行の最小数を見つけるために使用されるインデックス(最も 選択的なインデックス)。
-
表は、複数列のインデックスを持っている場合、オプティマイザは、行を見つけるためにインデックスの任意の左端の接頭辞を使用することができます。あなたは3列のインデックスを持っている場合たとえば、
(col1, col2, col3)
あなたは、インデックス付き検索機能を持っている(col1)
、(col1, col2)
としても(col1, col2, col3)
。詳細については、 8.3.5、「マルチカラムインデックスを」。 -
カップリングを行う際に、別のテーブルから行を検索します。同じ種類とサイズを宣言した場合、MySQLはより効果的にインデックス列に使用することができます。この場合、 および それらが同じサイズとして宣言されている場合と同じであると考えられています。たとえば、 と 彼らは同じサイズである、しかし 、と はありません。
VARCHAR
CHAR
VARCHAR(10)
CHAR(10)
VARCHAR(10)
CHAR(15)
非バイナリ文字列間の比較のために、2つの列が同じ文字セットを使用します。例えば、ペア
utf8
に嘘をつくlatin1
嘘は、可能性が高かったインデックスの使用を排除します。そうでない場合、直接比較値、コンパレータ異なる列を変換することなく、インデックスの使用を防止することができる(例えば、列文字列は、時間または数列と比較されます)。所与の値に対して、として
1
数値のシーケンスでは、それは文字列内の複数の列とすることができる値の任意の数、例えば、に等しく'1'
、、' 1'
、'00001'
または'01.e1'
。これは文字列の列のいずれかのインデックスを使用する可能性を排除します。 -
検索特定のインデックス列のか、 値を。使用している場合、これは、プリプロセッサ、プリプロセッサチェックによって最適化され たインデックスの前に現れたすべてのキーパーツのを。この場合、それぞれのMySQLの表現や 表現キーのルックアップに一度、および定数と交換してください。すべての式が定数に置き換えている場合は、クエリはすぐに戻ります。例えば:
MIN()
MAX()
key_col
WHERE
key_part_N
=constant
key_col
MIN()
MAX()
SELECT MIN(key_part2),MAX(key_part2) FROM tbl_name WHERE key_part1=10;
-
パケットは、ソートまたは左端接頭利用可能なインデックス(例えば、ある場合に)並べ替えまたはグループにテーブルの上に完成 。全てのキーバック部分が場合あり、逆の順序で鍵を読み出します。参照 「最適化することで、セクション8.2.1.14を並べ替え」と 「パケットを最適化することにより、」セクション8.2.1.15フェスティバル。
ORDER BY
key_part1
,key_part2
DESC
-
いくつかのケースでは、クエリは、データラインを照会することなく、値を取得するために最適化することができます。(クエリのために必要なすべての結果指数と呼ばれる カバーインデックステーブル内の一部のカラムだけを使用してクエリは、インデックスに含まれている場合)、選択された値は、速度を向上させるために、インデックスツリーから検索することができます。
SELECT key_part3 FROM tbl_name WHERE key_part1=1
そう、ほとんどまたは小さなテーブルや大きなテーブルのすべての行に取り組むことの重要性クエリレポートのための重要な指標ではありません。行の中で最もアクセスのクエリのニーズは順次速くインデックスを処理するよりも読まれている場合。シーケンシャルリードは、クエリはすべての行を必要としない場合でも、可能な限りを見つけるために、ディスクを減らすことができます。詳細、ご参照くださいセクション8.2.1.20は、「フルテーブルスキャンを避けます」。