Q1: データベースにはどのようなインデックスがありますか?メリットとデメリットは何ですか? 1. B ツリー インデックス: ほとんどのデータベースで使用されるインデックス (innoDB は b+ ツリーを使用します)。データへのアクセス、特に範囲データの検索を高速化できます。欠点は、インデックスの左端の列からしか検索できず、インデックス内の列をスキップできないことです。クエリ内の列で範囲クエリが使用されている場合、右側のすべての列ではインデックス最適化を使用して検索することはできません。 2. ハッシュインデックス: ハッシュテーブルに基づいて実装されます。 MySQL では、メモリ エンジンのみがハッシュ検索を明示的にサポートします。ハッシュ検索は非常に高速ですが、ハッシュ インデックスにはハッシュ値と行ポインターのみが含まれ、フィールド値は格納されないため、インデックス内の値を使用して行の読み取りを回避したり、並べ替えを実行したりすることはできません。ハッシュ インデックスは、インデックス付けされた列の内容全体を使用してハッシュ値を計算するため、部分的な列一致検索はサポートされません。ハッシュは等価比較のみをサポートし、範囲クエリはサポートしません。ハッシュの競合が多く発生すると、メンテナンスコストが非常に高くなります。 InnoDB は「適応ハッシュ インデックス」をサポートしています。 3. 全文インデックス: 全文インデックスは、インデックス値を比較するのではなく、テキスト内のキーワードを検索する特殊なタイプのインデックスです。当初は MyISAM でのみ使用できましたが、5.6.24 以降では innoDB でもフルテキスト インデックスがサポートされるようになりました。フルテキスト インデックス クエリでは、Match....against を使用します。フルテキスト検索と値ベースの B ツリー インデックスを同じ列に同時に作成しても、競合は発生しません。 4. 空間データ インデックス (R ツリー インデックス)。MyISAM は R ツリー インデックスをサポートしています。利点は、プレフィックス クエリを必要とせず、すべての緯度のデータをインデックスするため、地理データの格納に使用できることです。欠点は、データを維持するために、MySQL の GIS 関連関数 (MBRCONTAINS() など) を使用する必要があることです。ただし、MySQL の GIS は完璧ではないため、ほとんどの人はこの機能を使用しません。 Q2: データベースのインデックスとして二分探索木や赤黒木を使用しないのはなぜですか? バイナリツリーが大量のデータを処理する場合、ツリーの高さが高すぎます。インデックス効率は非常に高く、logN に達しますが、大量のディスク IO が実行され、コストに見合いません。さらに、データを削除または挿入すると、データ構造がリンク リストに変更される可能性があり、バランス調整アルゴリズムの改善が必要になります。しかし、赤黒木に要素を挿入したり削除したりすると、色が変わったり、回転(左回転、右回転)が頻繁に行われるため、時間の無駄になります。ただし、データ量が少ない場合は、赤黒木に入れることができます。このとき、赤黒木の時間計算量は B 木よりも低くなります。したがって、上記を考慮して、データベースは最終的にインデックスとして b ツリーを選択しました。 Q3: BツリーとB+ツリーの応用シナリオ: 1. B ツリーは、ファイル システムや、mongoDB などのいくつかのデータベース インデックスでよく使用されます。 2.B+ツリーは主にMySQLデータベースのインデックスに使用されます。 Q4: B+ツリーとBツリーの利点 B ツリーの各ノードには、子ノードを指すインデックスが格納されるだけでなく、データ フィールドも格納されます。そのため、1 つのノードには子ノードを指すインデックスがあまりなく、ツリーが高くなり、ディスク IO 回数が多くなります。 B+ツリーは高さが低く、すべてのデータが同じレベルのリーフノードに格納されるため、クエリのパフォーマンスが安定し、範囲検索が便利です。 Q5: 複数の列をソートするときにインデックスを使用する際の落とし穴
MySQL のドキュメントによると、インデックスを作成するときに asc または desc を追加できます。例: これはどのような影響を与えるでしょうか? 両方とも int 型の列 test1 と test2 があるとします。 インデックス「idx1(test1,test2)」を作成します。 select * from table order by test1 ,test2 limit 1; を説明します。 インデックスソートを使用できます:
インデックスによるソートは使用できません:
インデックスは desc をサポートしていないため、複数列のインデックスはすべての列の昇順で保存されます。したがって、1 つの列のみを並べ替える場合、すべての列を昇順で並べ替える場合、またはすべての列を降順で並べ替える場合は、インデックスを使用できます。ただし、最初の列を昇順、2 番目の列を降順で使用する場合、または最初の列を降順、2 番目の列を昇順で使用する場合は、インデックスは使用できません。 上記は、MySQL インデックスの一般的な問題の詳細な概要です。MySQL インデックスの詳細については、123WORDPRESS.COM の他の関連記事に注目してください。 以下もご興味があるかもしれません:
|
<<: Idea で Tomcat のソースコードデバッグを開始し、デバッグのために Tomcat に入る方法
>>: Docker 接続 MongoDB 実装プロセスとコード例
Pantherは新人としてスタートし、今もまだ新人ですが、人々から学び、学んだことを時々皆さんと共有...
この記事では、MySQL 8.0.12のインストールされていないバージョンを設定して起動するための具...
1. スクロールの実装原理better-scroll のスクロール原理は、ブラウザのネイティブスクロ...
Web フロントエンド開発では、ページに多くの記事を表示することが避けられません。記事の最後にあるク...
1. haslayout と bfc は IE 固有の標準属性です。 2. BFC はページ上の分離...
一部の Web サイトでは、画像が連続的にスクロールしているのをよく見かけます。この効果は、CSS ...
コードをコピーコードは次のとおりです。 <html> <ヘッド> <t...
目次1. MySQL の時刻型2. タイムゾーンを確認する3. 不正な時間値4. 厳密モード5. 事...
最近、Grover の Web サイトで楽しいホバー アニメーションを見つけ、自分自身のインスピレー...
プロジェクト要件: 製品ツリー ノードをクリックすると、そのノードのすべての親ノードが取得され、表に...
1. はじめにプロジェクトではMySQLを使用しています。インターネット上の例を参考にインストール...
目次1. 基本的な使い方2. 画像量の制御3. 画像形式の制限/複数の画像を選択可能補足: vueプ...
Docker の使用中に、いくつかの問題が発見されました。npm install や bundle ...
私が使用しているデータベースはMySQLデータベースバージョン5.7ですまずデータベーステーブルを自...
目次序文関数のオーバーロードマッピングタイプ部分的、読み取り専用、Null 可能、必須選択、記録除外...