MySQL インデックスの一般的な問題の概要

MySQL インデックスの一般的な問題の概要

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: 複数の列をソートするときにインデックスを使用する際の落とし穴

key_part の指定は ASC または DESC で終わることができます。これらのキーワードは、昇順または降順のインデックス値の保存を指定するために将来の拡張で許可されています。現在、これらは解析されますが無視され、インデックス値は常に昇順で保存されます。

MySQL のドキュメントによると、インデックスを作成するときに asc または desc を追加できます。例: add index idx(a asc,b desc)ただし、MySQL は実際にはこれを無視します (落とし穴です...)。desc はバージョン 8.0 以降でサポートされているようです。

これはどのような影響を与えるでしょうか?

両方とも int 型の列 test1 と test2 があるとします。

インデックス「idx1(test1,test2)」を作成します。
たとえば、test1とtest2でソートしたいとします。SQL

select * from table order by test1 ,test2 limit 1; を説明します。

インデックスソートを使用できます:

  • テスト1で注文
  • test1 降順で並べ替え
  • test1、test2 で並べ替え
  • test1 降順、test2 降順で並べ替え

インデックスによるソートは使用できません:

  • test1、test2、desc で並べ替え
  • test1 desc、test2 で並べ替え

インデックスは desc をサポートしていないため、複数列のインデックスはすべての列の昇順で保存されます。したがって、1 つの列のみを並べ替える場合、すべての列を昇順で並べ替える場合、またはすべての列を降順で並べ替える場合は、インデックスを使用できます。ただし、最初の列を昇順、2 番目の列を降順で使用する場合、または最初の列を降順、2 番目の列を昇順で使用する場合は、インデックスは使用できません。

上記は、MySQL インデックスの一般的な問題の詳細な概要です。MySQL インデックスの詳細については、123WORDPRESS.COM の他の関連記事に注目してください。

以下もご興味があるかもしれません:
  • MySQL インデックス障害の上位 10 の問題の概要
  • MySQLデータベースインデックスの欠点と適切な使用

<<:  Idea で Tomcat のソースコードデバッグを開始し、デバッグのために Tomcat に入る方法

>>:  Docker 接続 MongoDB 実装プロセスとコード例

推薦する

WeChatアプレットに2048ミニゲームを実装する詳細なプロセス

レンダリング サンプルコード今日は、WeChat アプレットを使用して 2048 ゲームを実装します...

MySQL 継続的集計の原理と使用法の分析

この記事では、例を使用して、MySQL の継続的な集計の原理と使用方法を説明します。ご参考までに、詳...

Zookeeper 不正アクセス テストの問題

目次序文Zookeeper サービスのオープンを検出情報を入手する接続テスト接続先修理計画参照する序...

WeChatミニプログラムページ間の価値転送を実装する方法の例

ミニプログラムページ間で値を渡すみなさんこんばんは。こんばんはと言うのは、これを夜に書いたからです。...

Vue プロジェクトで addRoutes を使用する際の問題の解決策

目次序文1. 404 ページ1. 原因2. 解決策2.白い画面を更新する1. 原因2. 解決策3. ...

CSS フロントエンドページレンダリング最適化属性 will-change の具体的な使用法

序文スクロールやサイズ変更などのスクロール イベントがトリガーされると、トリガーの頻度が非常に高くな...

JenkinsのLinuxインストール手順と各種問題解決(ページアクセス初期化パスワード)

1. Java環境jdk1.8を準備するJavaがインストールされているかどうかを確認します。イン...

Win10システムにMySQL 8.0をインストールするときに発生する問題を解決する

Win10 システムに MySQL 8.0 をインストールする際に発生する問題と解決策は次のとおりで...

MySQL デュアルマシン ホットスタンバイ実装ソリューション [テスト可能]

目次1. コンセプト2. 環境の説明3. マスタースレーブホットスタンバイ実装1. コンセプト1. ...

フォームを送信した後、別のファイルに移動する

<br />質問:特定のファイルにジャンプするには、HTML でどのように記述すればよい...

CSS3はキングをマッチングさせるときにパーティクルアニメーション効果を実現します

コーディングをしていると、多くのことが同じ結末を迎えることに気づくでしょう。問題を解決する方法は何千...

キャンバス操作プラグイン fabric.js の使い方を詳しく解説

Fabric.js は非常に便利なキャンバス操作プラグインです。ここでは、日常のプロジェクトで使用さ...

CentOS7 は rpm を使用して MySQL 5.7 をインストールするチュートリアル図

1. 4つのrpmパッケージをダウンロードする mysql-コミュニティクライアント-5.7.26-...

MySQLデータベースに中国語の文字を保存するときに発生するエラーを解決する方法を教えます

目次1. 遭遇した問題2. 問題を分析する3. 本当の問題4. 解決策5. ソリューション効果1. ...

CSS3は円錐グラデーション効果を実現します

文法:背景画像: 円錐グラデーション(位置の角度から、開始色、...、最後の色)最初のパラメータ:開...