MySQLインデックスに関する重要な面接の質問をいくつか共有します

MySQLインデックスに関する重要な面接の質問をいくつか共有します

序文

インデックスは、データベース内の 1 つ以上の列の値を並べ替え、データベースが効率的にデータを取得するのに役立つデータ構造です。

たとえて言うと、データベースのインデックスは本の目次に相当します。本の中の知識ポイントを見つけたいとき、本のすべてのページを検索する代わりに、目次で直接探すことができます。しかし、これはインデックスの欠点でもあります。データベースを変更するとき、インデックスの変更にはより多くの時間がかかります。

しかし、MySQL インデックスを本当に理解していますか?これらの質問は、インデックスに関するいくつかの重要な知識ポイントを理解するのに役立ちます。

1. 最左接頭辞原理とは何ですか?

以下の回答はすべてMySQLのInnoDBエンジンに基づいています

例えば次の表の場合

B+ツリー構造を使用して名前フィールドに基づいてインデックスを作成すると、おおよそのインデックス構造は次のようになります。

名前が「张」で始まるすべての人のIDを見つけるためにあいまい検索を実行したい場合、SQL文は次のようになります。

名前が「张%」のようなテーブルから ID を選択

B+ ツリー構造インデックスでは、インデックス項目はインデックス定義に表示されるフィールドの順序に従ってソートされます。検索時に、インデックスは ID が 100 の Zhang Yi をすばやく見つけ、条件が満たされなくなるまで、名前が Zhang で始まるすべての人物を右に直接移動します。

つまり、条件を満たす最初の人を見つけたら、そのまま右にトラバースすることができます。インデックスは順序付けされているため、条件を満たすすべての人が集められます。

左に配置してから右に移動するこの方法は、最左接頭辞原則と呼ばれます。

2. インデックスとしてハッシュ テーブルではなく B+ ツリーを使用するのはなぜですか?

1. ハッシュ テーブルは、インデックス フィールドを対応するハッシュ コードにマッピングし、対応する位置に格納します。このように、あいまい検索を実行する場合、ハッシュ テーブル構造は明らかにサポートされておらず、テーブルをトラバースすることしかできません。 B+ ツリーは、最左プレフィックス原理を通じて対応するデータをすばやく見つけることができます。

2. 100 から 400 までの ID を持つ人を検索するなど、範囲検索を実行する場合、ハッシュ テーブルはこれをサポートしていないため、テーブル全体を走査することしかできません。

3. インデックス フィールドはハッシュ化によってハッシュ コードにマップされます。多数のフィールドが同じ値のハッシュ コードにマップされると、結果として得られるインデックス構造は非常に長いリンク リストになり、検索時間が大幅に増加します。

3. 主キー インデックスと非主キー インデックスの違いは何ですか?

たとえば、次のテーブルの場合 (実際には、上記のテーブルに k フィールドが追加されています)、ID が主キーになります。

主キーインデックスと非主キーインデックスの概略図は次のとおりです。

ここで、R は行全体の値を表します。

図から、主キー インデックスと非主キー インデックスの違いは、非主キー インデックスのリーフ ノードには主キー値が格納され、主キー インデックスのリーフ ノードにはデータの行全体が格納されることであることが簡単にわかります。非主キー インデックスはセカンダリ インデックスとも呼ばれ、主キー インデックスはクラスター化インデックスとも呼ばれます。

これら 2 つの構造に基づいてクエリを実行し、クエリの違いを確認してみましょう。

1. クエリ ステートメントがselect * from table where ID = 100場合、つまり主キー クエリ メソッドの場合、ID の B+ ツリーのみを検索する必要があります。

2. クエリ ステートメントがselect * from table where k = 1場合、つまり非主キー クエリの場合は、最初に k インデックス ツリーを検索して ID = 100 を取得し、次に ID インデックス ツリーを再度検索します。このプロセスはテーブル リターンとも呼ばれます。

さて、それらの違いがわかりますか?

4. 自動増分主キー インデックスの使用が推奨されるのはなぜですか?

この主キーインデックスツリーでは

ID = 650 のデータ行を挿入する場合は、右端に挿入するだけです。

ただし、ID = 350 のデータ行を挿入する場合、B+ ツリーは順序付けされているため、ID = 350 のデータを挿入するためのスペースを確保するために、下のリーフ ノードを移動する必要があり、時間がかかります。R4 が配置されているデータ ページがいっぱいの場合は、ページ分割操作が必要になり、さらに状況が悪化します。

ただし、主キーが自動増分である場合、挿入される各 ID は前の ID よりも大きくなるため、位置を移動したり分割したりせずに、毎回最後に挿入するだけで済み、パフォーマンスが向上します。そのため、自動インクリメント主キーを持つインデックスを使用することをお勧めします。

要約する

以上がこの記事の全内容です。この記事の内容が皆様の勉強や仕事に何らかの参考学習価値をもたらすことを願います。123WORDPRESS.COM をご愛顧いただき、誠にありがとうございます。

以下もご興味があるかもしれません:
  • MySQL FAQ コレクション
  • 2019 年最新の MySQL 面接でよく聞かれる質問 21 選の紹介
  • 上級 MySQL データベース面接の質問と回答
  • MySQL 面接でよく聞かれる質問への回答
  • 面接でよく聞かれるMySQLの質問と回答を集めて、しっかりした基礎を築く

<<:  Vue3 での watchEffect の使用に関する簡単な分析

>>:  Ubuntu 16.04.5LTS に SVN をインストールする手順

推薦する

IDEA を使用して Web プロジェクトを作成し、Tomcat に公開する方法

目次ウェブ開発1. Web開発の概要Tomcatのインストールと設定Tomcatをインストールする2...

Grafana+Prometheus を使用して MySQL サービスのパフォーマンスを監視する

Prometheus (プロメテウスとも呼ばれる) 公式サイト: https://prometheu...

MySQL 最適化における B ツリー インデックスの知識ポイントのまとめ

SQL を最適化する必要があるのはなぜですか?当然ですが、SQL ステートメントを記述する場合、次の...

HTML テーブルタグチュートリアル (33): セルの垂直配置属性 VALIGN

垂直方向では、セルの配置を上、中央、下に設定できます。基本的な構文<TD VLIGN=&quo...

MySQL のロックとトランザクションの簡単な分析

MySQL 自体はファイルシステムに基づいて開発されましたが、ロックの存在が異なります。データベース...

トップナビゲーションバー機能を実現するCSS+HTML

ナビゲーション バー、固定トップ ナビゲーション バー、およびセカンダリ メニューの実装効果図の実装...

複合主キーと複数列インデックスに遭遇した場合の MySQL 行ロックの詳細な説明

背景今日、他のプロジェクト チームと協力してシス​​テムのストレス テストを実施しているときに、プロ...

mysqlを完全にアンインストールします。個人テストです!

MySQL をクリーンアンインストールします。個人的にテストしたところ、今回はようやくうまくいきま...

MySQL複合インデックスの概要

目次1. 背景2. 複合インデックスを理解する3. 左端一致原則4. フィールド順序の影響5. 単一...

CSS中級者向けアダプティブレイアウトの5つのソリューションの詳細な説明

序文ページを作っていく上で、ページレイアウトに関する内容に遭遇することが多く、面接でも聞かれることも...

JavaScript で一意の ID を生成するいくつかの方法

考えられる解決策1. Math.randomは[0,1)の範囲の乱数を生成します。 //今回は生成さ...

Vueはechart円グラフの凡例のパーセンテージを表示するメソッドを実装します

この記事では主に、echart を使用してパーセンテージを表示する Vue の円グラフデータ部分を紹...

Dockerコンテナ間の通信を実装する方法

シナリオ: laradock 開発環境 (php7.3+mysql5.7) がローカルに構築されてい...

Nginx バージョンのスムーズなアップグレードソリューションの詳細説明

目次背景: Nginx スムーズ アップグレード ソリューションフォールバック手順要約する背景:負荷...

React+TypeScriptプロジェクト構築事例解説

React プロジェクトの構築は非常に簡単ですが、Typescript と組み合わせると、実際にはそ...