MySQLインデックスの各種タイプ

4218 ワード

インデックスとは何ですか?
インデックスは、指定されたデータを素早く検索するためのデータベース格納エンジンのデータ構造です。
新華字典を使って類比をすることができます。もし新華字典の中で各字の詳細な説明がデータベースの中の表の記録であれば、部首やピンインなどの順に並べられている目次が索引です。それを使って私達が速く検索できるようにします。
MySQLでは、エンジンも同様の方法でインデックスに対応する値を見つけてから、該当するインデックス値に基づいて対応テーブルに記録されている位置を見つけます。
面接ではなぜインデックスを聞きますか?
インデックスが面接でよく聞かれるのは、インデックスがデータベースの良好な性能表現の鍵であり、クエリを最適化するための最も効果的な手段であるからです。インデックスは簡単に検索性能を数桁上げることができます。
しかし、悪いインデックスも同様に検索性能に影響します。テーブルのデータ量が多くなるとインデックスの性能に影響が大きくなります。データ量が少なく、比較的低い責任を負うと、悪いインデックスの性能に対する影響は明らかではないかもしれませんが、データ量がだんだん多くなると、性能が急激に低下します。
索引の種類
前の紹介を経て、本題に入り、MySQLにサポートされているインデックスの種類とその原理と使い方を調べてみます。
異なるタイプのインデックスは、異なるシーンに対してより良い性能を提供することができる。MySQLでは、インデックスはサーバレベルではなく、ストレージエンジンレベルで実現される。ご存知のように、MySQLは様々なタイプのストレージエンジンをサポートしています。したがって、異なる記憶エンジンにおけるインデックスの実現方法は同じではなく、すべてのタイプのインデックスがすべての記憶エンジンによってサポートされているわけではない。複数の記憶エンジンが同じタイプのインデックスをサポートしても、その下の実装は異なるかもしれない。
B-Tree索引
B-TreeインデックスはほとんどのMySQL記憶エンジンによってサポートされています。インデックスについて議論する際、特にタイプを説明していない場合、その確率はB-Treeインデックスと言います。私たちがB-Treeという言葉を使うのは、MySQLが表を作る時や他の語句にこのキーワードを使うからです。
しかし、異なる記憶エンジンの底部では、例えばInnoDB記憶エンジン内部ではB+Tree構造が使用されており、NDBクラスタ記憶エンジン内部ではT−Tree構造が使用されている。B-Treeインデックスは、異なる記憶エンジンによって使用されても、性能が異なる場合があります。例えば、InnoDBのインデックスには元のデータフォーマットが格納されていますが、MyISAM記憶エンジンはプレフィックス圧縮技術を使用してインデックスをより小さくし、InnoDBインデックスの行に格納されているデータ行のキーを参照し、MyISAM記憶エンジンのインデックスの行にはデータ行の物理位置が格納されています。
B-Tree索引の原理
B-Tree索引はデータにアクセスする速度を速くすることができます。全表スキャンが不要なので、必要なデータを素早く検索することができます。B-Treeインデックスはどうやってできますか?簡単な例を通して、InnoDBのB-Treeインデックスはどのように働いているかを調べます。

CREATE TABLE `om_address` (
 `province_name` varchar(255) NOT NULL COMMENT ' ',
 `city_name` varchar(255) NOT NULL COMMENT ' ',
 `district_name` varchar(255) NOT NULL COMMENT ' ',
 `detailed_address` varchar(255) NULL DEFAULT NULL COMMENT '    ',
 INDEX `index_province_city_district`(`province_name`, `city_name`, `district_name`) USING BTREE
) ENGINE = InnoDB;
この表には4つのフィールドがあります。それぞれ省、市、区と詳しい住所を表しています。またB-Tree索引があります。ここには省、市、区の3つのフィールドが含まれています。インデックスのすべての値は、現在のノードよりもノードの左のサブツリーが小さく、ノードの右のサブツリーが現在のノードよりも大きいという順序で格納されているからである。データを検索すると、インデックスのルートノードから検索を開始し、対応するインデックス値が見つかるまで、現在のノードのインデックス値を比較することによってサブツリーを検索します。
B-Tree索引の使い方
B−Treeインデックスの特徴により、フル値整合、値範囲整合、および最左プレフィックスマッチングに使用できます。
  • フル値マッチングとは、インデックス内のすべてのフィールドと一致することを指します。例えば、アムール川省ハルビン市南岡区のデータを調べます。
  • 値範囲マッチングとは、インデックス内のフィールドのある範囲で一致することを意味するが、最初のフィールドprovince_など、前のフィールドの完全一致を満たす必要がある。name省名の全整合、第二のフィールドcity_name都市名の範囲が一致します。
  • 最左プレフィックスマッチングとは、インデックス内のフィールドの先頭部分をマッチングさせることであるが、最初のフィールドprovince_など、前のフィールドの完全一致を満たす必要がある。name省の名称は内モンゴルで、第二のフィールドcity_name都市名は「呼」で始まる。
  • ハッシュインデックス
    ハッシュインデックスは、ハッシュ・テーブルに基づいて実施され、インデックスが指すデータに正確に一致するために使用される。記憶エンジンは、各行のデータのすべてのインデックスフィールドに対して1つのハッシュコードを計算し、ハッシュコードは比較的小さい値であり、異なるデータから計算されたハッシュコードは一般的には異なる。ハッシュインデックスには、このハッシュコードと、このデータ行を指すポインタが格納されている。
    MySQLでは、Memory記憶エンジンのみがハッシュインデックスをサポートし、Memory記憶エンジンのデフォルトインデックスタイプである。また、InnoDB記憶エンジンにもハッシュインデックスが用いられており、適応ハッシュインデックスと呼ばれる。いくつかのインデックスが非常に頻繁に使用されている場合、InnoDB記憶エンジンは、B−Treeインデックスに基づいてメモリ内でハッシュインデックスを作成し、これによりB−Treeインデックスも高速ハッシュ検索の利点を持つようになる。
    ハッシュインデックスは、対応するデータのハッシュ値を保存するだけで、インデックスの構造は非常にコンパクトであり、スペースを占有するのは小さいが、クエリ速度も非常に速い。ただし、ハッシュインデックスは、完全値等値クエリーのみをサポートしており、インデックスフィールド範囲と部分インデックスフィールドのマッチングはできません。
    空間データ索引
    空間データ索引(R-Tree)は地理データの保存に主に使われ、あらゆる次元からデータをインデックスし、クエリの際に任意の次元を使ってグループクエリを行うことができます。現在、MyISAMストレージエンジンは空間データインデックスをサポートしていますが、MySQLのGIS関連の関数を使ってデータを維持しなければなりません。
    MySQLでは、空間インデックスは、GEOMETRY、POINT、LINEなどのような空間データタイプにのみ確立されます。
    全文索引
    全文索引は以前紹介した索引のように直接索引の中の値を比較するのではなく、検索したテキストの中のキーワードを直接比較して、検索エンジンのすることと類似しています。簡単なwhere条件のマッチングではありません。
    同じフィールドでは、全文索引とB-Tree索引を同時に作成できます。衝突はありません。全文索引はmatchとagainstの操作に適しています。普通のwhereの条件操作ではありません。MySQLでは、タイプがCHAR、VRCHARR、TEXTのフィールドで全文インデックスのみ作成できます。
    締め括りをつける
    インデックスは、B−Treeインデックス、ハッシュインデックス、空間データ索引、全文索引を含む、指定データに素早く検索するためのデータベース記憶エンジンのデータ構造であり、B−Treeインデックスは、私たちが最もよく使うものであり、InnoDB記憶エンジン内部ではB+Tree構造を使用している。ハッシュインデックスは、ハッシュ・テーブルに基づいて実施され、インデックスが指すデータに正確にマッチングするために使用される。空間データインデックスはすべての次元からデータをインデックスし、クエリの際に任意の次元でグループクエリを行うことができます。全文索引は検索テキストの中のキーワードを直接比較するもので、検索エンジンのようなものです。
    以上がMySQLインデックスの各種プロファイルの詳細です。MySQLインデックスタイプに関する詳細については、他の関連記事に注目してください。