ホームページ  >  記事  >  データベース  >  B ツリーとハッシュ インデックスの比較 (コード例)

B ツリーとハッシュ インデックスの比較 (コード例)

不言
不言転載
2019-03-27 10:08:552083ブラウズ

この記事の内容はB-treeとハッシュインデックスの比較(コード例)です、一定の参考値がありますので、困っている方は参考にしていただければ幸いです。あなたに。役に立ちます。

前書き: B ツリーとハッシュ データ構造を理解すると、さまざまなインデックス データ構造を使用するストレージ エンジン、特に MEMORY ストレージ エンジンでのクエリの実行を予測するのに役立ちます。これにより、B- を選択できるようになります。インデックスのストレージ エンジンとしてツリーまたはハッシュを使用します。

1. B ツリー インデックスの機能

B ツリー インデックスは、式 =、>、>=、<、<=、またはBETWEEN キーワード。 LIKE または to LIKE が使用され、ワイルドカード文字で始まらない定数文字列である場合、インデックスを比較に使用することもできます。

1. たとえば、次の SELECT ステートメントではインデックスが使用されます:

SELECT * FROM tbl_name WHERE key_col LIKE &#39;Patrick%&#39;;
SELECT * FROM tbl_name WHERE key_col LIKE &#39;Pat%_ck%&#39;;

最初のステートメントでは 'Patrick' <= key_col < 'Patricl'、2 番目のステートメントでは ' Pat ' <= key_col < 'Pau'

2. 次の SELECT ステートメントはインデックスを使用しません:

SELECT * FROM tbl_name WHERE key_col LIKE &#39;%Patrick%&#39;;
SELECT * FROM tbl_name WHERE key_col LIKE other_col;

最初のステートメントでは、LIKE 値はワイルドカード文字で始まります。 2 番目のステートメントでは、LIKE 値は定数ではありません。

「%string%」のような 3 文字を超える文字列クエリが使用される場合、MySQL は Turbo Boyer-Moore アルゴリズムを使用してモデルを初期化し、このモデルを使用して照合する方が高速になります。

WHERE 句内のすべての AND レベルにまたがらないインデックスは、クエリの最適化には使用されません。つまり、インデックスを使用できるようにするには、各 AND グループでインデックスのプレフィックスを使用する必要があります。

3. 次の WHERE 句はインデックスを使用します:

WHERE index_part1=1 AND index_part2=2 AND other_column=3

    /* index = 1 OR index = 2 */
WHERE index=1 OR A=10 AND index=2

    /* optimized like "index_part1=&#39;hello&#39;" */
WHERE index_part1=&#39;hello&#39; AND index_part3=5

    /* Can use index on index1 but not on index2 or index3 */
WHERE index1=1 AND index2=2 OR index1=3 AND index3=3;

4. これらの WHERE 句はインデックスを使用しません:

    /* index_part1 is not used */
WHERE index_part2=1 AND index_part3=2

    /*  Index is not used in both parts of the WHERE clause  */
WHERE index=1 OR A=10

    /* No index spans all rows  */
WHERE index_part1=1 OR index_part2=10

MySQL はインデックスがあってもインデックスを使用しないことがあります。インデックス。このようなことが起こる理由の 1 つは、インデックスを使用すると MySQL がテーブル内の行の大部分にアクセスする必要があるとオプティマイザが推定するためです。 (この場合、必要な検索が少なくなるため、テーブル スキャンの方がはるかに高速になる可能性があります。) ただし、LIMIT のようなクエリが特定の行を取得するためにのみ使用される場合、MySQL はとにかくインデックスを使用します。これは、行数を見つける方が速いためです。結果として返されます。

2. ハッシュ インデックスの機能

ハッシュ インデックスは、先ほど説明した機能とは多少異なります。

これらは、= または < を使用する場合にのみ使用されます。 =>(この記号については記事の最後で説明します) 等価比較のための演算子 (ただし非常に高速です)。これらは、値の範囲を検索するための < などの比較演算子と一緒には使用されません。このタイプの単一値ルックアップに依存するシステムは「キー値ストア」と呼ばれます。キー値ルックアップ クラスに MySQL を使用するには、可能な限りハッシュ インデックスを使用してください。

オプティマイザは、ハッシュ インデックスを使用して ORDER BY 操作を高速化することはできません。 (このようなインデックスは、シーケンス内の次のエントリの検索には使用できません。)

MySQL は、2 つの値の間におよそ何行あるかを判断できません (範囲オプティマイザがどのインデックスを使用するかを決定するために使用されます) 。 MyISAM または InnoDB テーブルをハッシュ インデックス付き MEMORY テーブルに変更すると、一部のクエリが影響を受ける可能性があります。

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

付録

= と <=> の違いの説明;:

同じ点: 通常の = 演算子と同様に、2 つの値が比較され、結果は 0 (等しくない) または 1 (等しい) になります。つまり、'A'<=> ;'B' は 0 を取得し、'a'<=>'a' は 1 を取得します。どちらも値の比較です。
違い: NULL の値には意味がありません。したがって、= 演算子は NULL を有効な結果として扱うことができません。したがって、<=>,'a' を使用してください <=> NULL は 0 NULL<=> NULL は 1 を与えます。 = 演算子とは対照的に、= 演算子の規則は 'a'=NULL であり、結果は NULL になります。NULL = NULL であっても、結果は NULL になります。ちなみに、NULL との比較は基本的に無意味であるため、MySQL 上のほとんどすべての演算子と関数はこのように動作します。

使用 2 つのオペランドに NULL が含まれる可能性がある場合、一貫したステートメントが必要なので、<=> を使用できます。

この記事はここですべてです。これで終わりです。その他の興味深いコンテンツについては、 、PHP 中国語 Web サイトの MySQL ビデオ チュートリアル 列に注目してください。

以上がB ツリーとハッシュ インデックスの比較 (コード例)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はsegmentfault.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。