Bツリーおよびハッシュデータ構造を理解することは,インデックスにこれらのデータ構造を使用するさまざまなストレージエンジンで(特にBツリーインデックスを使用するか,ハッシュインデックスを使用するかを選択できる内存
ストレージエンジンの場合に),さまざまなクエリーがどのように実行されるかを予測するのに役立つ可能性があります。
Bツリーインデックスの特性
Bツリーインデックスは=
、>
、>=
、<
、< =
,または之间的
演算子を使用する式で,カラム比較に使用できます。このインデックスは,就像
への引数がワイルドカード文字で始まらない定数文字列の場合の就像
比較にも使用できます。たとえば,次の选择
ステートメントはインデックスを使用します。
SELECT * FROMtbl_name在哪里key_col“帕特里克%”;SELECT * FROMtbl_name在哪里key_col“帕特% _ck %”;
最初のステートメントでは,“帕特里克。”< =
の行のみが考慮されます。2つめのステートメントでは,key_col
<“Patricl”“拍”< =
の行のみが考慮されます。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但不是在index2或index3* /…在哪里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ツリーインデックスでは,キーの任意の左端のプリフィクスを使用して行を検索できます)。