mysqlにはインデックスがありますか?

青灯夜游
リリース: 2022-11-08 19:28:36
オリジナル
2482 人が閲覧しました

mysql にはインデックスがあります。通常、MySQL のデータベース テーブルの行データにアクセスするには 2 つの方法があります。 1. シーケンシャル アクセス。つまり、テーブル内でテーブル全体のスキャンを実行し、条件を満たすターゲット データが見つかるまで最初から最後まで行ごとにスキャンします。条件が順序付けされていない行データ内に見つかった場合; 2. インデックス アクセスは、インデックスをトラバースしてテーブル内のレコード行に直接アクセスすることです。 MySQL インデックスのデータ構造は BTree と Hash の 2 種類に分けられ、BTree は BTree と B Tree に分けることができます。

mysqlにはインデックスがありますか?

このチュートリアルの動作環境: Windows7 システム、mysql8 バージョン、Dell G3 コンピューター。

MySQL インデックスとは何ですか?

インデックスは、データ テーブル内の 1 つ以上の列で構成される特別なデータベース構造であり、データ テーブル内の特定の値を持つレコードを迅速にクエリするために使用できます。ここではインデックスの意味や機能、メリット・デメリットについて詳しく解説します。

インデックスを使用してデータをクエリする場合、レコード内のすべての情報を読み取る必要はなく、インデックス列をクエリするだけで済みます。それ以外の場合、データベース システムは照合のために各レコードのすべての情報を読み取ります。

この索引は、新華辞典の発音順序と比較できます。たとえば、「く」という単語を調べたい場合、発音順序を使用しない場合、400 ページの辞書からページごとに検索する必要があります。ただし、ピンインを抽出して発音シーケンスを作成する場合は、10 ページを超える発音表から直接検索するだけで済みます。これにより時間を大幅に節約できます。

したがって、インデックスを使用すると、データベースのクエリ速度が大幅に向上し、データベース システムのパフォーマンスが効果的に向上します。

インデックスを使用する理由

インデックスとは、列の値とレコード行の間の関係を、ある基準に基づいて特定の順序で確立したものです。対応テーブルは基本的に、インデックス列の列値と元のテーブルのレコード行の間の 1 対 1 の対応を記述する順序付けされたテーブルです。

インデックスは MySQL の非常に重要なデータベース オブジェクトであり、データベース パフォーマンス チューニング テクノロジの基礎であり、データの高速な取得を実現するためによく使用されます。

MySQL では、通常、データベース テーブルの行データにアクセスする方法が 2 つあります。

1) シーケンシャル アクセス

シーケンシャル アクセスは、 table 順序付けされていない行データの条件を満たすターゲット データが見つかるまで、最初から最後まで 1 行ずつスキャンして、テーブル全体のスキャンを実行します。

シーケンシャル アクセスは実装が比較的簡単ですが、テーブル内に大量のデータがある場合、効率は非常に低くなります。例えば、数千万のデータの中から少量のデータを検索する場合、シーケンシャルアクセスを行うと全データを横断することになり、時間がかかり、データベースの処理性能に影響を与えるのは明らかです。

2) インデックス アクセス

インデックス アクセスは、インデックスをトラバースしてテーブル内のレコード行に直接アクセスする方法です。

この方法を使用する前提は、テーブルにインデックスを作成することです。列にインデックスを作成した後、データを検索するときに、テーブルのインデックスに基づいて、対応するレコード行の位置を直接見つけることができます。列をクリックすると、データをすばやく見つけることができます。インデックスは、指定された列のデータ値へのポインターを格納し、指定された並べ替え順序に従ってこれらのポインターを並べ替えます。

たとえば、学生基本情報テーブル tb_students で、student_id に基づいてインデックスが設定されている場合、システムはインデックス列から実際のレコードまでのマッピングテーブルを作成します。ユーザーが Student_id 12022 のデータを検索する必要がある場合、システムはまず Student_id インデックスでレコードを検索し、次にマッピング テーブルを通じてデータ行を直接検索し、データ行を返します。一般に、インデックスのスキャン速度は実際のデータ行のスキャン速度よりもはるかに速いため、インデックスを使用するとデータベースの効率が大幅に向上します。

つまり、インデックスを使用せずに、MySQL は最初のレコードから始めて、関連する行が見つかるまでテーブル全体を読み取る必要があります。テーブルが大きくなるほど、データのクエリにかかる時間が長くなります。テーブル内のクエリ対象のカラムにインデックスがある場合、MySQL はすべてのデータを確認することなく、データ ファイルを検索する場所にすぐにアクセスできるため、時間を大幅に節約できます。

MYSQL インデックスの分類

1. 通常インデックスと一意インデックス

  • 通常インデックス: MySQL の基本的なインデックス タイプ。インデックスを定義するカラムに重複値や null 値を挿入できます。

  • 一意のインデックス: インデックス カラムの値は次のとおりである必要があります。一意ですが、NULL 値は許可されます

    • 結合インデックスの場合、列値の組み合わせは一意である必要があります
    • 主キー インデックスは特別な一意のインデックスです

2. 単一列インデックスと複合インデックス

  • 単一列インデックス: インデックスには次の内容のみが含まれます。単一列であり、テーブルには複数の単一列インデックスを持つことができます
  • 結合インデックス: テーブル内で複数のフィールドの組み合わせで作成されたインデックス
    • インデックスは、これらの左側のフィールドが一致する場合にのみ使用されます。フィールドはクエリ条件で使用されます (左端のプレフィックス原則)

3. フルテキスト インデックス

  • フルテキスト インデックスのタイプは次のとおりです。 fulltext
  • は、インデックスを定義する列の値の全文検索をサポートし、これらのインデックス列に重複を挿入できるようにします。値と null 値
  • フルテキスト インデックスは、 char、varchar、text タイプの列に作成されます

4、空間インデックス

  • 空間インデックスは、空間データ型のフィールドに対して確立されたインデックスです。

  • MySQL には、Geometry、Point、および 4 つの空間データ型があります。 Linestring と Polygon

  • MySQL は Spatial キーワードを使用して拡張されており、通常のインデックスの作成と同様の構文を使用して空間インデックスを作成できます

  • 空間インデックスを作成する 列は null 値を許可せず、MyISAM テーブルでのみ作成できます。

5. 接頭辞インデックス

  • char、varchar、および text 型の列にインデックスを作成する場合、インデックス列の長さを指定できます

MySQL インデックスのデータ構造

MySQL インデックスのデータ構造は、BTree とハッシュ、および BTree の 2 種類に分類できます。 BTreeとB-Treeに分けることができます。

ハッシュ: ハッシュ テーブルを使用してデータを保存し、キーはインデックス列を保存し、値は行レコードまたは行ディスク アドレスを保存します。

ハッシュは、等しい値のクエリ ("=、"IN"、"") のみをサポートし、範囲クエリはサポートしません (理由は、ハッシュの各キー間に接続がないためです) )、ハッシュ クエリの効率は非常に高く、時間計算量は O(1) です。

BTree: マルチツリーに属します。マルチウェイバランス検索ツリーとも呼ばれます。

プロパティ:

  • BTree のノードには複数の要素 (キー値 - データ/子ノードのアドレス)が格納されます。
  • BTree ノードのキー値は次のとおりです。非降順で配置
  • BTree すべてのリーフ ノードは同じ層 (同じ深さ) に配置されます

mysqlにはインデックスがありますか?

#たとえばクエリ プロセス: Select * from table where id = 6;

mysqlにはインデックスがありますか?

BTree の欠点:

  • は範囲クエリの高速検索をサポートしていません (各クエリは
  • すべてのノードにデータを保存すると、ディスク データ ストレージが分散し、クエリ効率が低下します。

B ツリー: BTree に基づいて、BTree 最適化を実行します: リーフ ノードのみがキー値データを保存し、非リーフ ノードはキー値と子ノードのアドレスのみを保存します。リーフ ノードは双方向ポインタを使用して接続され、双方向の順序付きリンク リストを形成します。

mysqlにはインデックスがありますか?

等しい値のクエリ、例: Select * from table where id = 8;

mysqlにはインデックスがありますか?

Range クエリ、for例: Select * from table where id between 8 and 22;

mysqlにはインデックスがありますか?

B Tree の利点:

  • 高速な等価クエリと範囲クエリ検索を保証します。
  • 単一ノードにより多くの要素が保存され、IO クエリの数が削減されます

[関連する推奨事項: mysql ビデオ チュートリアル ]

以上がmysqlにはインデックスがありますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート