ホームページ  >  記事  >  データベース  >  mysqlインデックスの紹介

mysqlインデックスの紹介

王林
王林転載
2020-01-30 21:11:382080ブラウズ

mysqlインデックスの紹介

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

インデックスとは、データを効率的に取得するためのデータ構造です。

インデックスのタイプ

FULLTEXT、(HASH、BTREE[mysql で使用される 2 つの主要なタイプ])、RTREE。

1. FULLTEXT

はフルテキスト インデックスで、現在 MyISAM エンジンでのみサポートされています。これは CREATE TABLE、ALTER TABLE、および CREATE INDEX で使用できますが、現時点では CHAR、VARCHAR、および TEXT 列にフルテキスト インデックスのみを作成できます。

全文インデックスは MyISAM とともに誕生したものではなく、WHERE name LIKE "%word%" のようなテキストに対するあいまいクエリの効率が悪いという問題を解決するために登場しました。

(無料の学習ビデオ チュートリアルの推奨:

mysql ビデオ チュートリアル)

2. HASH

HASH の一意性 (ほぼ 100% 一意) および類似のキーのため値 正しい形式はインデックスとしての使用に適しています。

HASH インデックスは一度検索すれば、ツリー インデックスのように階層ごとに検索する必要がないため、非常に効率的です。ただし、この効率性は条件付きです。つまり、「=」および「in」条件下でのみ効率的であり、範囲クエリ、並べ替え、および結合インデックスについては依然として効率的ではありません。

3. BTREE

BTREEインデックスとは、インデックス値を一定のアルゴリズムに従ってツリー状のデータ構造(二分木)に格納する手法で、各クエリの入り口からルートから開始してノードを順番にたどって、葉を取得します。これは、MySQL でデフォルトで最も一般的に使用されるインデックス タイプです。

4. RTREE


#RTREE は MySQL ではほとんど使用されず、ジオメトリ データ型のみをサポートします。この型をサポートする唯一のストレージ エンジンは、MyISAM、BDb、InnoDb、NDb、そしてアーカイブ。

BTREE と比較した場合、RTREE の利点は範囲検索にあります。

#インデックス タイプ

通常のインデックス: クエリのみを高速化します

ユニーク インデックス: 一意の列値 (null を含めることもできます) を使用してクエリを高速化します

主キーインデックス: Accelerate クエリの列値は一意です (null は不可) テーブルには 1 つだけあります

複合インデックス: 複数の列値がインデックスを形成し、特に複合検索に使用され、その効率が向上しますはインデックスの結合より大きいです

全文インデックス: テキスト コンテンツをセグメント化して検索します。

インデックスの使用

1. インデックスを作成します

1 --创建普通索引CREATE INDEX index_name ON table_name(col_name);
2 --创建唯一索引CREATE UNIQUE INDEX index_name ON table_name(col_name);
3 --创建普通组合索引CREATE INDEX index_name ON table_name(col_name_1,col_name_2);
4 --创建唯一组合索引CREATE UNIQUE INDEX index_name ON table_name(col_name_1,col_name_2);

2. テーブルの変更による構造作成インデックス

ALTER TABLE table_name ADD INDEX index_name(col_name);

3. テーブル作成時にインデックスを直接指定

CREATE TABLE table_name (
    ID INT NOT NULL,col_name VARCHAR (16) NOT NULL,INDEX index_name (col_name)
);

4. インデックスの削除

--直接删除索引DROP INDEX index_name ON table_name;
--修改表结构删除索引ALTER TABLE table_name DROP INDEX index_name;

5. その他のコマンド

- 查看表结构
    desc table_name;
 - 查看生成表的SQL
    show create table table_name;
 - 查看索引
    show index from  table_name;
 - 查看执行时间
    set profiling = 1;
    SQL...
    show profiles;

インデックス失敗の原因

1. 完全な値の一致。これはインデックスが使用されていないことと同等です。 。

2. 最適なプレフィックス ルールを満たさない場合も、インデックス障害が発生する可能性があります。

3. インデックスに対して何か (計算、関数、(自動または手動) 型変換) を実行すると、インデックスが失敗し、テーブル全体のスキャンが行われます。

4. MySQL は、等しくない (a8093152e673feb7aba1828c43532094, !=) を使用するとインデックスを使用できないため、テーブル全体がスキャンされます。

5. インデックスが null または null でない場合でも使用できません。

6. ('�c') のようなワイルドカード スイッチを使用すると、インデックスの失敗とテーブル全体のスキャンが発生します。

7. 文字列インデックスが一重引用符で囲まれていない場合、インデックスは無効になります。

8. 以下を使用します。またはを使用して接続すると、インデックスが失敗します。

9. select * クエリを使用し、カバリング インデックスを使用してみます。

mysql インデックスの仕様

1. 【必須】ビジネスにおいて固有の特性を持つフィールドは、複数のフィールドの組み合わせであっても、固有のインデックスを構築する必要があります。 (注: 一意のインデックスが挿入速度に影響するとは考えないでください。この速度低下は無視できます (

)。ただし、検索速度の向上は明らかです。さらに、非常に完全な検証制御が行われたとしても(アプリケーション層では、一意のインデックスがない限り、マーフィーの法則に従って、ダーティ データが生成されなければなりません。)

2. [必須] 3 つ以上のテーブルの結合は禁止されています。結合する必要があるフィールドのデータ型は完全に一貫している必要があり、複数のテーブルに関連するクエリを実行する場合は、関連するフィールドにインデックスが必要であることが保証されます。


(注: 二重テーブルを結合する場合でも、テーブルのインデックスと SQL パフォーマンスに注意する必要があります。)

3. [必須] テーブルにインデックスを作成する場合varchar フィールドの場合は、インデックスの長さを指定する必要があります。フィールド全体にインデックスを付ける必要はなく、実際のテキストの区別に基づいてインデックスの長さを決定するだけです。


(注: インデックスの長さと識別は矛盾しています。一般に、文字列型データの場合、長さ 20 のインデックスの識別は 90% 以上になります。

count(distinct left(column name,index length))/count(*) の区別を使用して決定できます。)

4. [必須] ページ内では左ファジーまたはフルファジーは固く禁止されています。必要に応じて検索エンジンに解決させてください。


(注: インデックス ファイルには B-Tree の左端のプレフィックス マッチング機能があります。左端の値が決まらない場合、このインデックスは使用できません。)

推奨される関連記事チュートリアル:

mysql チュートリアル

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

声明:
この記事はcnblogs.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。