この記事では、mysql に関する関連知識を提供し、主にインデックス構造に関する関連問題を紹介します。なぜインデックス作成がこれほど高速になるのでしょうか?以下で見てみましょう。皆さんのお役に立てれば幸いです。
推奨学習: mysql チュートリアル
まず、次のことを知っておく必要があります。永続化を実現するには、インデックスはハードディスクにのみ保存できますが、インデックスを介してクエリを実行すると、ハードディスクへの I/O 操作が発生するため、インデックスを設計する際には、インデックスの数を減らす必要があります。可能な限り検索を行うことで、I/O にかかる時間を削減します。
さらに、非常に重要な原則を知っておく必要があります。データベース管理の記憶域スペースの基本単位は ページ (Page)
であり、複数の行レコード (Row) が 1 つのページに保存されます。 。
コンピュータ システムは、ディスク I/O の 先読み
最適化を実行します。I/O が実行されると、現在のディスク アドレスのデータに加えて、隣接するデータも実行されます。メモリ バッファ プールでは、各 I/O で読み取られるデータは 1 ページになります。InnoDB のデフォルトのページ サイズは 16KB です。
64 の連続したページは エクステント
を形成し、1 つ以上のエクステントは セグメント
を形成し、1 つ以上のセグメントは テーブルスペース
を形成します。 InnoDB には 2 つのテーブル スペース タイプがあります。共有テーブル スペースとは、複数のテーブルが 1 つのテーブル スペースを共有することを意味します。独立テーブル スペースとは、各テーブルのデータとインデックスがすべて独立したテーブル スペースに格納されることを意味します。
データ ページの構造は次のとおりです (出典: Geek Time "MySQL Must Know"):
データ ページの 7 つの構造コンテンツは、次のように大別できます。次の 3 つのカテゴリ:
詳細については、タオバオのデータベース カーネル月次レポートを参照してください
当然のことながら、二分探索ツリー、二分平衡ツリーなど、検索アルゴリズムに関連するいくつかの一般的なデータ構造について考えます。実際、Innodb のインデックスは B Tree
を使用して実装されています。なぜこのインデックスが実装されているかを見てみましょう。構造が選ばれました。
二分探索木の定義を簡単におさらいしましょう。二分探索木では、検索対象のキーがルート ノードより大きい場合、検索でルート ノードが検索されます。右のサブツリー。キーがルート ノードより小さい場合は、キーが見つかるまで左のサブツリーを検索します。時間計算量は O(logn) です。たとえば、シーケンス [4,2,6,1,3,5,7] は次の二分探索ツリーを生成します:
ただし、一部の特殊なケースでは、二分木の深さはたとえば、[1,2,3,4,5,6,7] は次のツリーを生成します:
次の状況では、最悪の場合、 7回の確認で目的の結果が得られ、クエリ時間はO(n)となります。
この状況を最適化するために、平衡二分探索木 (AVL ツリー) が存在します。AVL ツリーとは、左右の部分木の高さの差が 1 を超えない木を指します。時間計算量は O(logn) であり、これはすでに理想的な検索ツリーですが、数千万行のレコードを持つデータベースでは、ツリーの深さは依然として非常に高く、依然として最も理想的な構造ではありません。
したがって、二分木から N 分木に拡張すると、N 分木によって木の深さが大幅に削減されることは容易に想像できます。実際、4 層のツリー構造はすでに数十テラバイトのデータをサポートできます。
B ツリー (バランス ツリー) は、このような N 分木です。B ツリーは B ツリーとも呼ばれ、次の定義を満たします:
B ツリーの次数を k とします (ノードが持つことができる子ノードの最大数)、
k - 1
個のキーワードと子ノードへの k
ポインタが含まれます。 上で述べたように、各 I/O は 1 ページのサイズのディスク ブロックのデータを事前に読み取ります。ディスク ブロックの内容は I/O を表すために使用されます。 B ツリーの構造は次のとおりです (出典: Geek Time SQL が知っておくべき):
B ツリーも順序付けされており、子ノード ポインターはキーワードより 1 大きい必要があるため、ノードのセクションは、図の例のように、ディスク ブロック 2 のように、各ノードには 2 つのキーと 3 つの子ノードがあり、最初のバイト ポイントのキーは 3 です。 、 5 は最初の子ノード 8 より小さく、2 番目の子ノードの 9、10 は 8 と 12 の間にあり、3 番目の子ノードの値 13、15 はそれ自体の 2 番目の子ノード 12 より大きくなります。
今 9 を見つけたいとします。手順は次のとおりです。
B ツリーの構築方法では、親ノードのキーワードについて、左側のサブツリーのすべてのキーワードはそれより小さく、右側のサブツリーのすべてのキーワードはそれ以上になります。
ルート ノード ディスク 1 (1,18,35) と比較し、16 は 1 と 18 の間にあり、ポインタ P1 を取得します。 、ディスク 2 を指します
範囲クエリをサポートできます。リーフ ノード
ハッシュ インデックスが指すデータは順序付けされていないため、ハッシュ インデックスは範囲クエリを実行できず、ORDER BY 並べ替えもサポートしません。
ハッシュは完全一致であるため、あいまいクエリは実行できません。
アダプティブ ハッシュ インデックスは、一種の「インデックスのインデックス」として理解できます。ハッシュ インデックスは、B ツリー インデックスにページ アドレスを格納し、対応するリーフ ノードを迅速に見つけるために使用されます。これは、innodb_adaptive_hash_index
変数を通じて表示できます。
推奨学習: mysql チュートリアル
以上がMySQL インデックス構造の深い理解の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。