【MySQL】MySQLインデックスの下位実装に関する問題解読


1、なぜHashテーブルをインデックスにしないのですか?
Hashテーブルは、select*from sangoo where id>10などの範囲クエリーが困難です.
2、なぜバランスツリーをインデックスにしないのですか?
バランスツリーは範囲クエリーをサポートしますが、このデータ構造は範囲検索で親ノードに遡り、B+ツリーのリーフノードのポインタの効率が向上します.
3、なぜBツリーの1つのノードに複数の要素を格納する構造を選択しますか?
データベースのインデックスはファイルに格納されているため、ファイルの内容を読み取るにはディスクI/O操作が必要であり、通常のツリーのノードは1つの要素しかなく、ディスクI/Oを行う回数が多く、Bツリーの1ノードのマルチデータの構造はディスクI/Oの回数を減らし、検索効率を高めた.
4、ディスクアクセスデータのローカル原理
あるデータが取り出されると、そのデータの周りに必ず使われます.
5、オペレーティングシステムがデータを保存する単位
オペレーティングシステムはページ単位でデータにアクセスします.1ページのデフォルトは4 KBです.
6、一つのノードの中に何個の要素を保存すればいいですか?あるいは1つのノードはどのくらいの大きさですか?
オペレーティング上のシステムはページ単位でアクセスされるため、データの無駄を避けるために、1つのノードのサイズはページの整数倍にする必要があります.MySQLデータベースの1ページのサイズは16 KBなので、1つのノードには4ページが必要です.
7、MySQLのB+ツリーはなぜ非リーフノードにデータを保存しないのですか?
MySQLのB+ツリーのノードのサイズはデータベースの1ページのサイズで、データが格納されていると、格納されているインデックス数が減少し、B+数全体が高くなり、ディスクI/O回数が増加し、検索効率が低下します.
8、MyISAMとInnoDBの主キーインデックスB+ツリーの違いは?
MyISAMのB+ツリーインデックスのリーフノードにはデータのアドレスが格納されているが、InnoDBエンジンのB+ツリーのリーフノードには直接データが格納されており、ディスクI/O操作を1回減らすことができる.
9、MyISAMとInnoDBの補助インデックスと補助インデックスB+ツリー構造の違い?
MyISANのセカンダリインデックスの格納構造はプライマリ・キー・インデックスと同じであり、InnoDBのセカンダリ・インデックスのB+ツリーのリーフ・ノードにはすべてのデータが格納されず、各行のデータのプライマリ・キーが格納されている.テーブルにプライマリ・キーが作成されていない場合、InnoDBは自分で非表示のデフォルト・プライマリ・キー・ストレージを作成する.
10、MySQLの1ページのデフォルト値はなぜ16 KBですか?
1行のデータが1 KBサイズであると仮定すると、B+ツリーの1つのリーフノードは16行(16 KB/1 KB)のデータを格納することができ、非リーフノードはインデックス値とポインタのみを格納し、プライマリキーインデックスはInnoDBのデフォルトでbigIntタイプ(8 B)、1つのポインタのサイズは6 Bであるため、1つの非リーフノードは1170対のインデックス+ポインタを格納することができ、B+ツリーの高さが2の場合、リーフノードの個数は117016データで、高さが3の場合、1170170* 3データを格納できます.1ページのデータは16 KBで十分です.
11.連合インデックスの記憶
コンビネーションインデックスは、複数のインデックスをつなぎ合わせてB+ツリーを構築します.
12、インデックスが使えるかどうかをどう判断しますか?
B+ツリーを使用するノードがクエリー範囲の縮小に役立つ場合はインデックスが使用され、クエリー条件がB+ツリーのノードでクエリー範囲を縮小できない場合はインデックスが使用されません.したがって、連合インデックスクエリは、最左接頭辞の原則に従い、最左接頭辞の原則を使用しないと、連合インデックスは使用されません.
13、最左接頭辞の原則
テーブル内のフィールドa,b,cに対して連合インデックスが確立され、順序がa,b,cである場合.
select * from table where a = 1 ;
select * from table where a = 1 and b = 1;
select * from table where a = 1 and b = 1 and c = 1;
select * from table where a = 1 and c = 1;

以上のフィールドを使用してクエリーを行うsql文はいずれもインデックスに使用されますが、最後のsql文は少し異なります.a、cフィールドによってクエリーが結合されますが、aのインデックスのみが使用され、インデックスを使用した結果は最初の文に等しくなります.つまり、c=1は結合インデックスに使用されません.
b、bc、cフィールドを単独で使用すると、連合インデックスは使用されません.