mysqlインデックスの作成方法とメリットとデメリットの分析を詳しく理解する

3634 ワード

前言
インデックス(index)は、MySQLがデータを効率的に取得するのに役立つデータ構造です.高性能には重要ですが、忘れたり誤解したりすることが多いです.インデックスは、データが大きいほど重要です.規模が小さく、負荷が軽いデータベースはインデックスがなくてもパフォーマンスが向上しますが、データが増加するとパフォーマンスが急速に低下します.
インデックスを作成する理由
これは、インデックスの作成により、システムのパフォーマンスが大幅に向上するためです.
第一に、一意性インデックスを作成することで、データベース・テーブル内の各行のデータの一意性を保証できます.
第二に、データの取得速度を大幅に速めることができます.これもインデックスの作成の最も主要な原因です.
第三に、テーブルとテーブルの間の接続を加速することができ、特にデータの参照整合性を実現する上で特に意義がある.
第四に、パケットおよびソート句を使用してデータ検索を行う場合、クエリ内のパケットおよびソートの時間を大幅に短縮することができる.
第五に、インデックスを使用することで、クエリーの過程で、最適化隠し器を使用して、システムの性能を高めることができます.
インデックスを増やすメリットがこんなに多いのに、なぜテーブルの各カラムにインデックスを作成しないのかと聞かれるかもしれません.この考えには合理性があるが、一面性もある.インデックスには多くの利点がありますが、テーブルの各カラムにインデックスを追加するのは賢明ではありません.
これは、インデックスを増やすことにも多くの不利な側面があるからです.
第一に、インデックスの作成と維持には時間がかかります.この時間は、データ量が増加するにつれて増加します.
第二に、インデックスは物理空間を占める必要があり、データテーブルがデータ空間を占める以外に、各インデックスは一定の物理空間を占める必要がある.クラスタインデックスを作成する場合は、必要なスペースがより大きくなります.
第三に、テーブル内のデータを増加、削除、修正する場合、インデックスも動的にメンテナンスされ、データのメンテナンス速度が低下します.
インデックスの作成に適したフィールド:
インデックスは、データベース・テーブルの一部のカラムの上に作成されます.したがって、インデックスを作成するときは、インデックスを作成できるカラムと、インデックスを作成できないカラムをよく考慮する必要があります.
一般的には、次のようなカラムにインデックスを作成する必要があります.
第一に、常に検索が必要な列では、検索の速度を速めることができます.
第二に、プライマリ・キーとしてのカラムでは、カラムの一意性とテーブル内のデータの配列構造を強制する.
第三に、接続によく使われる列では、これらの列は主にいくつかの外部キーであり、接続の速度を速めることができる.
第四に、インデックスがソートされているため、指定された範囲が連続しているため、常に範囲に基づいて検索する必要がある列にインデックスを作成する.
第五に、インデックスがソートされているため、常にソートが必要な列にインデックスを作成します.これにより、クエリーはインデックスのソートを利用して、ソートクエリーの時間を速めることができます.
第六に、WHERE句でよく使われる列の上に索引を作成し、条件の判断速度を速める.
インデックスを作成するには、一般的にselectのwhere条件に従って作成されます.たとえば、selectの条件はwheref 1 andf 2である場合、フィールドf 1またはフィールドf 2に履歴書インデックスを作成するのは役に立たず、フィールドf 1とf 2にインデックスを同時に作成するだけで役立ちます.
インデックスの作成に適していないフィールド:
同様に、一部のカラムではインデックスを作成するべきではありません.一般に、インデックスを作成するべきでないカラムには、次のような特徴があります.
第1に、クエリであまり使用されていないカラムや参照されているカラムに対してインデックスを作成するべきではありません.なぜなら、これらのカラムはあまり使用されないため、インデックスがあるかインデックスがないか、
クエリーの速度を上げることはできません.逆に,インデックスが増加するため,システムのメンテナンス速度が低下し,空間的要件が増大する.
第二に、データ値が少ないカラムに対してもインデックスを追加するべきではありません.これは、人事表の性別列など、これらの列の値が少ないためです.
クエリーの結果では、結果セットのデータ行がテーブル内のデータ行の大きな割合を占めます.つまり、テーブル内で検索する必要があるデータ行の割合が大きいです.
インデックスを追加すると、検索速度が大幅に速くなるわけではありません.
第三に、textとして定義されたimageおよびbitデータ型のカラムにインデックスを追加するべきではありません.これは、これらのカラムのデータ量がかなり大きいか、値が少ないためです.
第四に、変更パフォーマンスが取得パフォーマンスよりはるかに大きい場合、インデックスを作成するべきではありません.これは,性能の修正と検索性能が矛盾しているためである.
インデックスを追加すると、取得のパフォーマンスは向上しますが、変更のパフォーマンスは低下します.インデックスを減らすと、変更のパフォーマンスが向上し、取得のパフォーマンスが低下します.
したがって、変更パフォーマンスが取得パフォーマンスよりはるかに大きい場合は、インデックスを作成するべきではありません.
インデックスの作成方法:
1、索引の作成、例えばcreateindexontable_name(列のリスト);
2、表の修正、例えばaltertabletable_nameaddindex[インデックスの名前](列のリスト);
3、テーブルを作成するときにインデックスを指定します.例えばcreatetabletable_name([...],INDEX[インデックスの名前](列のリスト);
テーブル内のインデックスの表示方法:
showindexfromtable_name;索引の表示
インデックスのタイプと作成例:
1.PRIMARYKEY(プライマリ・キー・インデックス)

mysql>altertabletable_nameaddprimarykey(`column`)

2.UNIQUEまたはUNIQEKEY(ユニークインデックス)

mysql>altertabletable_nameaddunique(`column`)

3.FULLTEXT(全文索引)

mysql>altertabletable_nameaddfulltext(`column`)

4.INDEX(一般索引)

mysql>altertabletable_nameaddindexindex_name(`column`)

5.複数列インデックス(クラスタインデックス)

mysql>altertable`table_name`addindexindex_name(`column1`,`column2`,`column3`)

テーブルのインデックスを変更するには、次の手順に従います.

altertabletablenamedropprimarykey,addprimarykey(fileda,filedb)

まとめ
インデックスがあれば、レコード数の多いテーブルでは、クエリーの速度を向上させることができます.しかし、インデックスはスペースを占有しているので、インデックスを作成するときに本稿に基づいて参考にすることができ、役に立つかもしれません.