10bet网址
MySQL 5.6リファレンスマニュアル
本手册下载
PDF (Ltr)- 26.8 mb
PDF (A4)- 26.8 mb
HTML下载(TGZ)- 7.2 mb
HTML下载(邮政编码)- 7.2 mb


MySQL 5.6リファレンスマニュアル/.../ Bツリーインデックスとハッシュインデックスの比較

8.3.8 Bツリーインデックスとハッシュインデックスの比較

Bツリーおよびハッシュデータ構造を理解することは,インデックスにこれらのデータ構造を使用するさまざまなストレージエンジンで(特にBツリーインデックスを使用するか,ハッシュインデックスを使用するかを選択できる内存ストレージエンジンの場合に),さまざまなクエリーがどのように実行されるかを予測するのに役立つ可能性があります。

Bツリーインデックスの特性

Bツリーインデックスは>>=<< =,または之间的演算子を使用する式で,カラム比較に使用できます。このインデックスは,就像への引数がワイルドカード文字で始まらない定数文字列の場合の就像比較にも使用できます。たとえば,次の选择ステートメントはインデックスを使用します。

SELECT * FROMtbl_name在哪里key_col“帕特里克%”;SELECT * FROMtbl_name在哪里key_col“帕特% _ck %”;

最初のステートメントでは,“帕特里克。”< =key_col<“Patricl”の行のみが考慮されます。2つめのステートメントでは,“拍”< =key_col<“保罗”の行のみが考慮されます。

次の选择ステートメントはインデックスを使用しません。

SELECT * FROMtbl_name在哪里key_col像“%帕特里克%”;SELECT * FROMtbl_name在哪里key_col就像other_col

最初のステートメントでは,就像値はワイルドカード文字で始まります。2つめのステートメントでは,就像値は定数ではありません。

...像“%字符串%’を使用し,字符串が3文字より長い場合,MySQLは涡轮Boyer-Mooreアルゴリズムを使用して,文字列のパターンを初期化してから,このパターンを使用して検索をより迅速に実行します。

col_name为空を使用した検索では,col_nameにインデックスが設定されている場合にインデックスが使用されます。

在哪里句内のすべてのレベルにまたがっていないインデックスは,クエリーの最適化に使用されません。言い換えると,インデックスの使用を可能にするには,インデックスのプリフィクスがすべてのグループで使用されている必要があります。

次の在哪里句ではインデックスが使用されます。

...在哪里index_part1= 1,index_part2= 2,other_column= 3 / *指数= 1或指数= 2 */…在哪里指数=1或a =10和指数=2 /*优化like "index_part1= '你好' " * /…在哪里index_part1= '你好'index_part3=5 /*可以使用索引index1但不是在index2index3* /…在哪里index1= 1,index2= 2或index1= 3,index3= 3;

これらの在哪里句ではインデックスが使用されません

/*index_part1不使用*/…在哪里index_part2= 1,index_part3=2 /*在WHERE子句的两个部分都没有使用索引*/…在哪里指数=1 OR A=10 /*没有索引跨越所有行*/…在哪里index_part1= 1或index_part2= 10

MySQLではインデックスが使用できる場合でも使用しないことがあります。これが発生する1つの状況は,オプティマイザが,インデックスを使用することによってMySQLがテーブルの大部分の行にアクセスする必要があると推定した場合です。(この場合,必要なシークが少ないため,テーブルスキャンの方がはるかに高速になる可能性があります)ただし,そのようなクエリーで,行の一部のみを取得する限制を使用している場合,結果で返す少数の行をはるかにすばやく見つけることができるため,MySQLはとにかくインデックスを使用します。

ハッシュインデックスの特性

ハッシュインデックスは先述したものといくらか異なる特性を持ちます。

  • それらは,または< = >演算子を使用する等価比較にのみ使用されます(ただしきわめて高速です)。それらは,値の範囲を見つける<などの比較演算子には使用されません。この種類の単一値ルックアップに依存するシステムは,キー値ストアとして知られています。そのようなアプリケーションでMySQLを使用するには,可能なかぎりハッシュインデックスを使用します。

  • オプティマイザはハッシュインデックスを使用して,命令操作を高速化することはできません。(この種類のインデックスは順番に次のエントリを検索するために使用できません)。

  • MySQLは2つの値の間におよそどのくらいの行数があるかを判断できません(これは範囲オプティマイザによって使用するインデックスを特定するために使用されます)。これは,MyISAMまたはInnoDBテーブルをハッシュインデックス設定された内存テーブルに変更した場合に,一部のクエリーに影響することがあります。

  • 行の検索にはキー全体のみを使用できます。(Bツリーインデックスでは,キーの任意の左端のプリフィクスを使用して行を検索できます)。