ホームページ >データベース >mysql チュートリアル >MySQLインデックスの構文は何ですか
インデックスは、MySQL がデータを効率的に取得するのに役立つ順序付けされたデータ構造であり、MySQL 公式のインデックスの定義です。クエリの効率を向上させるために、インデックスはデータベース テーブルのフィールドに追加されるメカニズムです。データベース システムは、データに加えて、特定の検索アルゴリズムを満たすデータ構造も維持します。これらのデータ構造は、何らかの方法でデータを参照 (ポイント) するため、これらのデータ構造に高度な検索アルゴリズムを実装できます。このデータ構造は、索引。 。以下の図に示すように:
実際、簡単に言うと、インデックスはソートされたデータ構造です。
左側データ テーブルには合計 2 列と 7 つのレコードがあり、一番左はデータ レコードの物理アドレスです (論理的に隣接するレコードがディスク上で物理的に隣接しているとは限らないことに注意してください)。 Col2 の検索を高速化するために、右に示すようにバイナリ検索ツリーを維持できます。各ノードには、インデックス キー値と、対応するデータ レコードの物理アドレスへのポインタが含まれています。 なので、二分検索を使用して、対応するデータをすばやく取得できます。
インデックスの利点検索とソートの速度を高速化し、データベースのIOコストを削減します。 CPU 消費量
テーブルであり、主キー、インデックスのフィールド、ポイントが保存されます。エンティティへのクラス レコード自体がスペースを占有する必要があります
を指す インデックス ツリーのノードを変更する必要がある場合があります
しかし実際には、MySQL に保存するために二分探索ツリーでは、ここのノードは 1 つのデータのみを保存でき、ノードは MySQL のディスク ブロックに対応するため、毎回 1 つのディスク ブロックを読み取ることを知っておく必要があります。データは 1 つしか取得できず、効率が非常に悪いので、バイナリ検索ツリー を使用しません。なぜでしょうか?
B-tree 構造を使用して格納することを考えます。
インデックス構造インデックスは、サーバー層ではなく、MySQL のストレージ エンジン層に実装されます。したがって、インデックスはストレージ エンジン間で異なる場合があり、すべてのエンジンがすべての種類のインデックスをサポートしているわけではありません。BTREE インデックス: 最も一般的なインデックス タイプで、ほとんどのインデックスが B ツリー インデックスをサポートします。
HASH Index: メモリ エンジンによってのみサポートされており、使用シナリオは簡単です。
R ツリー インデックス (空間インデックス) : 空間インデックスは MyISAM エンジンの特殊なインデックス タイプで、主に地理空間データ タイプに使用されますが、通常はあまり使用されません。特別な紹介は行いません。
フルテキスト (フルテキスト インデックス) : フルテキスト インデックスも MyISAM の特殊なインデックス タイプで、主にフルテキスト インデックスに使用されます。 Mysql5.6 バージョンから全文インデックスをサポートします。
#INNODB エンジン | #MYISAM エンジン |
##メモリ エンジン | ##BTREE インデックス |
|||||||||||
サポート | サポート済み | HASH インデックス | ##サポートされていません||||||||||||
## サポートされていません | サポートされている | R ツリー インデックス | サポートされていません | |||||||||||
サポート | サポート対象外 | 全文 | バージョン 5.6 以降でサポートされます | |||||||||||
サポートされます | サポートされません |
明示的に指定しない限り、通常参照するインデックスは、B ツリー (多方向検索ツリー、必ずしもバイナリである必要はない) 構造を使用して編成されています。クラスター化インデックス、複合インデックス、プレフィックス インデックス、およびインデックスと呼ばれる一意のインデックスはすべて、デフォルトで B ツリー インデックスを使用します。 BTREEマルチパスバランス検索ツリー、m 次 (m フォーク) BTREE は次の条件を満たします:
#キーワード case の挿入 #m 次 B ツリーのプロパティを破壊しないことを保証Due to 3 順序には最大 2 つのノードしか含めることができないため、最初は 26 と 30 が一緒になっていますが、その後 85 が分割され始めます。30 は上部中央の位置になり、26 は残り、85 は次の位置に移動します右 つまり: になります。 70 を再度図に挿入すると、たまたま 70 が中央の上の位置になり、その後 62 が維持され、再び 85 になります 新しいノードを分割します 上のレベルの後、再び分割する必要があります 同じ理由で上方向に分割し続けます比較利点二分探索ツリーと比較して、高さ/深さが低く、自然なクエリ効率が高くなります。 B TREE
B Tree のクエリ効率はより安定しています
が形成され、シーケンシャル ポインタを備えた B ツリーが形成され、改善されます。インターバルアクセスのパフォーマンス。 注意深い生徒なら、この図と二分探索ツリー図の最大の違いは何であるかがわかるでしょうか?
##二分探索ツリー図: インデックスの原理 BTree インデックス: 初期化の概要水色のブロックはディスク ブロックと呼ばれ、各ディスクが表示されます。ブロックには複数のデータが含まれています項目 (濃い青で表示) とポインター (黄色で表示)たとえば、ディスク ブロック 1 には、ポインター P1、P2、および P3 を含むデータ項目 17 と 35 が含まれています。P1 は、17 ブロック未満のディスクを表します。 、P2 は 17 ~ 35 のディスク ブロックを表し、P3 は 35 より大きいディスク ブロックを表します。
検索プロセスデータ項目 29 を検索する場合、最初にディスク ブロック 1 がディスクからメモリにロードされ、この時点で IO が発生します。メモリ内で二分探索を使用して、29 が 17 ~ 35 の間にあることを確認し、ディスク ブロック 1 の P2 ポインタをロックします。メモリ時間は (ディスクの IO と比較して) 非常に短いため、無視できます。ディスクを使用します。ディスク ブロック 1 からディスク ブロック 3 の P2 ポインタのアドレスがディスクからメモリにロードされます。2 番目の IO が発生します。29 は 26 と 30 の間にあります。ディスク ブロック 3 の P2 ポインタはロックされています。ディスク ブロック 8 がロードされます。ポインタを介してメモリにアクセス 3 回目の IO が発生 同時にメモリが通過 二分検索が 29 に達してクエリが終了し、合計 3 回の IO が発生します。 インデックスの分類インデックス構成テーブルとは、主キー順にインデックスとして格納されるテーブルで、InnoDB エンジンに適した方式です。 InnoDB は B ツリー インデックス モデルを使用するため、データは B ツリーに保存されます。 各インデックスは InnoDB の B ツリーに対応します。 mysql> create table T( id int primary key, k int not null, name varchar(16), index (k))engine=InnoDB; 复制代码 テーブル内のR1~R5の(ID,k)値は(100,1)、(200,2)、 (300,3)、(500,5)、および (600,6)、2 つのツリーの図の例は次のとおりです。図からはわかりにくいですが、リーフ ノードの内容に応じて、インデックス タイプが主キー インデックスと非主キー インデックスに分けられます。 主キー インデックス データ テーブルの主キー列は主キー インデックスを使用し、デフォルトで作成されます。これが、インデックス付けを学ぶ前に、先生がよく私たちにこう言ったのです。主キーに基づいたクエリです。高速になります。主キー自体にインデックスが付けられていることがわかります。
データ行全体が格納されます。 InnoDB では、主キー インデックスはクラスター化インデックス の値です。 InnoDB では、補助インデックスはSecondary Index (セカンダリ インデックス) とも呼ばれます。 以下に示すように:
ステートメントが select * from T where ID=500 (主キー クエリ メソッド) の場合、ID の B ツリーを検索するだけで済みます。
拡張機能 -- インデックス プッシュダウンいわゆるプッシュダウンは、その名前が示すように、実際には テーブルの戻り操作を延期します。MySQL はそれを許可しません。とてももったいないので簡単にテーブルに戻ります。それはどういう意味ですか?次の例を考えてみましょう。 複合インデックス (名前、ステータス、アドレス) を確立しました。これも、次の図のように、このフィールドに従って保存されます。 複合インデックス ツリー (インデックス列とアドレスのみを保存します)主キーはテーブルを返すために使用されます)
|
以上がMySQLインデックスの構文は何ですかの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。