MySQLのインタビュー-インデックス

序文

序文はありません、ナンセンスな話をしないでください、ただインタビューを始めてください

インタビュー開始

インタビュアー:インデックスとは

  • インデックスはデータ構造であり、検索効率を向上させるデータ構造です。B +ツリー、ハッシュなど

インタビュアー:B +ツリーについてのあなたの理解について教えてください

  • B +ツリーはバランスの取れたマルチブランチツリーです。Bツリーと比較すると、B +ツリーのデータにはリーフノードしかありません。リーフノードはリンクリストを形成するため、範囲クエリをサポートできます。B +ツリーのクエリ効率は次のとおりです。O(logH)、HはB +数の高さです。

インタビュアー:なぜInnoDBはBツリーの代わりにB +ツリーをインデックス構造として使用するのですか?

  • まず、B +ツリーをBツリーと比較します。非リーフノードもデータを格納するため、非リーフノードはより少ないメモリページを格納できます。同じ量のデータでは、Bツリーの高さはB +ツリーの高さよりも高いため、より多くのIO時間が必要になり、Bツリーの全体的な効率がB +ツリーよりも遅くなります。
  • Bツリーのリーフノードはリンクリストを形成しないため、Bツリーは範囲クエリをサポートしていません。
  • B +ツリーのデータはリーフノードにあり、クエリのパフォーマンスはより安定しています。

Bツリー(インターネットから撮影した写真)
B +ツリー(インターネットから撮影した写真)

インタビュアー:インデックスのカテゴリーは何ですか

  • 主キーインデックス、非主キーインデックス(通常のインデックス、一意のインデックス、共同インデックス)

インタビュアー:主キーインデックスと非主キーインデックスの違いは何ですか?

  • InnoDBでは、主キーインデックスはクラスター化インデックスとも呼ばれ、リーフノードはデータの行全体を格納します
  • InnoDBでは、非主キーインデックスは二次インデックスとも呼ばれ、リーフノードのコンテンツは主キーの値です。

mysql> create table T(
id int primary key, 
k int not null, 
name varchar(16),
index (k))engine=InnoDB;

主キーインデックスと非主キーインデックス

インタビュアー:フォームを返す方法を知っていますか?

  • ステートメントがselect * from T(ID = 300)、つまり主キークエリメソッドの場合、IDのB +ツリーを検索するだけで済みます。
  • 文がselect * from T(k = 3、つまり通常のインデックスクエリモード)の場合、最初にkインデックスツリーを検索し、ID 300の値を取得してから、IDインデックスツリーを再度検索する必要があります。このプロセスは、テーブルに戻ると呼ばれます。
  • つまり、非主キーインデックスに基づくクエリでは、もう1つのインデックスツリーをスキャンする必要があります。したがって、アプリケーションで主キークエリを使用するようにしてください。

インタビュアー:ヒットインデックスの原則は?

  • 「カバーリングインデックスの原則」または「左端のプレフィックスの原則」のいずれかを満たしている限り、インデックスを使用できます。
  • 詳細については、MySQLインデックスの使用規則を参照してください。

インタビュアー:カバーリングインデックスとは何ですか?

  • インデックスをカバーするということは、クエリステートメントの実行は、データテーブルから読み取ることなく、インデックスからのみ取得できることを意味します。インデックスカバレッジが達成されたとも言えます。

インタビュアー:最後の質問、遅いクエリを解決する方法は?

  • 問題を特定します。まず、遅いログを照会して、どのSQLステートメントに遅い照会があるかを判別します。
  • 問題を分析します。次に、SQLが遅くなる理由は一般に2つあります。1つはインデックスが使用されていないこと、もう1つは間違ったインデックスを使用していることです。
  • 問題の解決:インデックスが使用されていない場合は、explainを使用してSQLステートメントを分析し、インデックスが使用されているかどうかを判断できます。インデックスを使用する場合、正しいインデックスを使用しますか?間違ったインデックスを使用する場合は、force index()を使用してインデックスの使用を強制します。インタビュアーが引き続き質問する場合、なぜ間違ったインデックスを使用したのですか?簡単に言えば、InnoDBが使用するインデックスは値に基づいて決定され、この値はサンプル値に基づいて計算されます。サンプルであるため、サンプリングは比較的ランダムであり、間違いを犯すことは不可能ではありません。

インタビュアー:インタビューの最後に次のインタビューラウンドに入って、おめでとうございます

総括する

実際、インデックスに関する知識ポイントはまだたくさんありますが、ここでは詳しく説明しません。

  • インデックス作成に選択するフィールド
  • インデックスプッシュダウン
  • 説明フィールドの意味、フィールドに応じた調整方法

トーク

これを見ていただきありがとうございます。記事がうまく書かれていると思われる場合は、それに注意を払い、共有してください(私にとって非常に便利です)。
記事を改善する必要があるとお考えの場合は、ご提案をお待ちしております。メッセージを残してください。
あなたが何かを見たいのなら、私はあなたのメッセージを楽しみにしています。
あなたのサポートとサポートは私の創造の最大の動機です!

参照

  • 「高性能MySQL」
  • 「MYSQL実際の戦闘に関する45の講義」

おすすめ

転載: blog.csdn.net/Aaron_Tang_/article/details/114676877