MySQL を学習していると、よくインデックスに遭遇します。インデックスとは何ですか?使い方はなんとなく知っていたのですが、説明するのが少し難しかったので、将来聞かれたときのために、空いた時間を利用して本を読んで整理してみました。と書いて、感想を述べましたが、結局のところ、私は数年間これらにさらされてきたので、重要な点について話しましょう。 apache php mysql:
begin!
1. インデックスとは
1. インデックスの概要
インデックスは、実際にはファイルの形式でディスクに保存されるデータ構造です。ディスク I/O 操作が必要です。メインメモリとは異なり、ディスク I/O には機械的な移動コストがかかるため、ディスク I/O の消費時間は膨大になります。
2. IO の概要
IO はコンピューターの入出力を指します。プログラムとランタイム データはメモリ上に存在するため、データが交換される場所は通常ディスクです。ネットワークなどにはIOインターフェースが必要です。人生の例: 覚えておくべき重要なことはすべてノートに書き出す必要があり、記録を読むためにノートにアクセスするたびにそれを読む必要があります。このことを覚えておいてください。直接読み出すことができます。これはキャッシュです(コンピューターに常に保存できるわけではありません)。
2. インデックスアルゴリズム
1. データベースは基本的に B+Tree アルゴリズムを使用して実装されます
2. データベースインデックスはインデックス構造の品質を評価するために使用されます
3. B-Tree
(1) B ツリーの定義は、取得には最大でも h-1 ノードへのアクセスが必要であることを示しています (ルート ノードはメモリ内に存在します)。データベース システムの設計者は、ディスク先読みの原理を巧みに利用し、ノードのサイズを 1 ページに等しくなるように設定しました。これにより、各ノードが完全にロードされるために必要な I/O は 1 つだけになります
(2) B ツリーの実際の実装には、次の手法を使用する必要があります。新しいノードを作成するたびに、ページの領域を直接適用することにより、ノードが物理的にページに格納されるようになります。ページアライメントされているため、ノードは 1 つの I/O のみを必要とします
(3) B ツリー ストレージ構造を使用すると、検索中の I/O の数は通常 3 回を超えないため、B ツリーをインデックス構造は非常に効率的ですが、B ツリー内のノードには大量のキーワード情報を含めることができ、実際の状況に応じて分岐します
4.B+Tree
(1) B ツリーの検索複雑さは O です(h)=O(logdN) なので、ツリーの出次数 d が大きくなるほど、深さ h が小さくなるほど、I/O の数は少なくなります。 B+Tree は、各ノードが 1 ページ サイズであるため、出力次数 d の幅を正確に増やすことができます。そのため、出力次数の上限はノード内のキーとデータのサイズに依存します
(2) B+Tree のノードは削除されたデータであるため、より大きな出力次数を持つことができ、パフォーマンスが向上します
3. クラスター化インデックスと非クラスター化インデックス
(1) 物理的なストレージ順序クラスター化インデックス内のデータの数は同じです。 インデックスの順序は一貫しています。つまり、インデックスが隣接している限り、対応するデータもディスク上で隣接して格納される必要があります。クラスター化インデックスのクエリ効率は、非クラスター化インデックスよりもはるかに高くなります
4。 . インデックスの種類
1.UNIQUE(ユニークインデックス):同じ値は出現できません、はい、NULL値があります2.INDEX(通常のインデックス):同じインデックス内容が許可されます3.PROMARY KEY(プライマリキー)キーインデックス): 同じ値は許可されません4.FULLTEXT INDEX (全文インデックス): 内の特定の値をターゲットにできますが、効率は非常に悪いです5. 結合インデックス: 基本的に複数のフィールドが構築されます。 1 つのインデックスにまとめられ、列値の組み合わせは一意である必要があります5. インデックス作成スキル
1. インデックスには NULL 値が含まれません(1) 列に NULL 値が含まれている限り、インデックスは作成されます。複合インデックス内の 1 つの列に NULL 値が含まれている限り、この列はこの一致するインデックスに対して無効になります2. 可能であれば、短いインデックス
(1) を使用します。プレフィックスの長さを指定する必要があります。たとえば、char(255) の列がある場合、ほとんどの値が最初の 10 文字または 20 文字内で一意である場合は、列全体にインデックスを付けないでください。短いインデックスはクエリ速度を向上させるだけでなく、ディスク容量と I/O 操作を節約します
3.
(1) MySQL クエリはインデックスを 1 つだけ使用するため、インデックスが where 句で使用されている場合、order by の列はインデックスを使用しません。したがって、データベースのデフォルトの並べ替えが要件を満たす場合は、並べ替え操作を使用しないでください。必要に応じて、これらの列に対して複合インデックスを構築することをお勧めします
4. (1) 同様の操作を使用することは原則として推奨しません。使用する必要がある場合は、正しい使用方法に注意してください。 「%aaa%」はインデックスを使用しませんが、「aaa%」はインデックスを使用できます
5. NOT IN、<>、! は使用しないでください。 = 操作ですが、<,<=, =,>,>=,BETWEEN,IN はインデックスを使用できます
7。インデックスは、選択操作が頻繁に実行されるフィールドに確立する必要があります
(1)。これらの列がほとんど使用されない場合、インデックスの有無によってクエリ速度が大きく変わることはないためです。逆に、インデックスの追加により、システムのメンテナンス速度が低下し、必要なスペースが増加します
8. インデックスは、比較的ユニークな値を持つフィールドに確立する必要があります
9。およびビット データ型 列にはインデックスを付けないでください。これらの列のデータ量が非常に多いか、値が非常に少ないためです
10. where と join に表示される列にはインデックスを付ける必要があります
11. where 列のクエリ条件に不等号があります。 != ...), mysql インデックスは使用できません
12. where句のクエリ条件に関数が使用されている場合(where DAY (column) =...など)、mysqlインデックスを使用することはできません
13. 結合操作 (データを抽出するときに複数のデータテーブルからのデータが必要) では、mysql は主キーと外部キーのデータ型が同じ場合にのみインデックスを使用できます。それ以外の場合は、時間内に確立された場合、インデックスは使用されません
14.explain は、開発者が SQL の問題を分析するのに役立ちます。explain は、mysql がインデックスをどのように使用するかを示します。選択ステートメントと接続テーブルを処理するために、より適切なインデックスを選択し、より最適化されたクエリを作成するのに役立ちます。ステートメント
6. インデックスとロック1. ロックがインデックスを使用する場合、それは行ロックであり、インデックスが使用されない場合、それは行ロックであるため、操作されるデータは次のようになります。ロックを使用する(1) インデックスが作成されていない場合、データの選択または配置はテーブル全体のスキャンによって実行され、テーブル ロックが形成されます。インデックスがある場合は、指定された行 (つまり、行ロック。データの更新時にインデックスが使用されない場合、テーブル全体がスキャンされることに注意してください
end
このコンテンツのほとんどは、私がいくつかの情報を蓄積したものです。ネットや本で調べてもわかりにくいのでご容赦ください! 関連記事:
mysqlインデックス名の使い方と使用する場合インデックスとは何ですか?現在、Mysql にはいくつかの主要なインデックス タイプがあります
インデックスの簡単な紹介 - 6 日間で MySQL を理解するためのビデオ チュートリアル以上がmysql インデックスとは何ですか?またその使用方法は何ですか?非常に詳細に整理されているの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。