インデックス
1つは、インデックスの概念です。
- インデックスはソートされたリストであり、インデックスの値とこの値を含むデータの行の物理アドレスが格納されます(データレコードのメモリアドレスへのポインタを介したC言語のリンクリストと同様) )
- インデックスを使用した後、テーブル全体をスキャンせずに行のデータを見つけることができますが、最初にインデックステーブルからデータの行に対応する物理アドレスを見つけてから、対応するデータにアクセスするため、データベースのクエリ速度は加速されます。
- 索引は木の本のカタログのようなもので、カタログのページ番号に応じて必要なコンテンツをすばやく見つけることができます。
- インデックスは、テーブル内の1つまたは複数の列の値を並べ替える方法です。
- インデックス作成の目的は、テーブル内のレコードの検索または並べ替えを高速化することです。
第二に、インデックスの利点
- 適切なインデックスを設定した後、データベースはさまざまな高速ポジショニングテクノロジーを使用して、クエリ速度を大幅に高速化します。これが、すべてを作成する主な理由です。
- テーブルが大きい場合、またはクエリに複数のテーブルが含まれる場合、インデックスを使用すると、クエリの速度が数千倍になります。
- データベースのIOコストを削減でき、インデックスによってデータベースのソートコストも削減できます。
- 一意のインデックスを作成することにより、データテーブル内のデータの各行の一意性を確保できます。
- テーブルとテーブル間の接続を高速化できます。
- グループ化と並べ替えを使用すると、グループ化と並べ替えの時間を大幅に短縮できます。
3つ目は、インデックスの欠点です。
- インデックスには追加のディスク容量が必要です。
- MyISAMエンジンの場合、インデックスファイルとデータファイルは分離され、インデックスファイルはデータレコードのアドレスを保存するために使用されます。
- lnnoDBエンジンのテーブルデータファイルは、それ自体がインデックスファイルです。
- インデックスもそれに応じて変更されるため、データの挿入と変更には時間がかかります。
第四に、インデックスを作成するための主な基礎
インデックスはデータベースクエリの速度を上げることができますが、すべての状況でインデックスを作成するのに適しているわけではありません。インデックス自体がシステムリソースを消費するため、インデックスがある場合、データベースは最初にインデックスクエリを実行し、次に特定のデータ行を見つけます。インデックスが適切に使用されていない場合、データベースの負担が増大します。
- テーブルの主キーと外部キーにはインデックスが必要です。主キーは一意であるため、外部キーは子テーブルの主キーに関連付けられており、クエリ中にすばやく見つけることができます。
- 300行を超えるレコードを持つテーブルには、インデックスが必要です。インデックスがない場合は、クエリごとにテーブルをトラバースする必要があります。これは、データベースのパフォーマンスに深刻な影響を及ぼします。
- 他のテーブルに頻繁に接続されるテーブルの場合、接続フィールドにインデックスを確立する必要があります。
- 一意性の低いフィールドは、インデックス作成には適していません。
- 頻繁に更新されるフィールドは、インデックスの作成には適していません。
- where句に頻繁に現れるフィールド、特に大きなテーブルのフィールドには、インデックスを付ける必要があります。
- GROUPOBYおよびORDERBYであることが多いフィールドにインデックスを作成します。
- インデックスは、選択性の高いフィールドに基づいて作成する必要があります。
- インデックスは小さなフィールドに作成する必要があります。大きなテキストフィールドや長いフィールドのインデックスは作成しないでください。
V.インデックスの分類と作成
準備オーケー
5.1一般的なインデックス
最も基本的なインデックスタイプであり、一意性などの制限はありません。
- インデックスを直接作成する
CREATE INDEX 索引名 ON 表名 (列名[(length)]);
(列名(長さ)):長さはオプションで、以下と同じです。長さの値を省略すると、列全体の値がインデックスとして使用されます。列の最初の長さの
文字を使用してインデックスを作成するように指定すると、インデックスファイルのサイズを小さくするのに役立ちます。
インデックス名は「_index」で終わることをお勧めします。
- テーブルを変更して作成する
ALTER TABLE 表名 ADD INDEX 索引名 (列名);
- テーブル作成時にインデックスを指定します
CREATE TABLE 表名( 字段1 数据类型,字段2 数据类型[,...],INDEX 索引名 (列名));
5.2一意のインデックス
通常のインデックスと似ていますが、一意のインデックス列の各値が一意である点が異なります。一意のインデックスはnull値を許可します(主キーとは異なることに注意してください)。複合インデックスを使用して作成されている場合
、列値の組み合わせは一意である必要があります。一意のキーを追加すると、一意のインデックスが自動的に作成されます。
- 一意のインデックスを直接作成する
CREATE UNTQUE INDEX 索引名 ON 表名(列名);
- テーブルを変更して作成する
ALTER TABLE 表名 ADD UNIQUE 索引名(列名);
- テーブル作成時に指定する
CREATE TABLE 表名 (字段1 数据类型,字段2 数据类型[...],UNTQUE 索引名(列名));
5.3主キーインデックス
これは特別な一意のインデックスであり、「PRLINARYKEY」として指定する必要があります。テーブルは主キーを1つだけ持つことができ、null値は許可されません。主キーを追加すると、主キーインデックスが自動的に作成されます。
- テーブル作成時に指定する
CREATE TABLE表名( [ ... ],PRIMARY KEY(列名));
- テーブルを変更して作成する
ALTERTABLE表名ADD PRIMARY KEY(列名);
5.4複合インデックス(単一列インデックスと複数列インデックス)
これは、単一の列で作成されたインデックスでも、複数の列で作成されたインデックスでもかまいません。
selectステートメントのwhere条件は左から右に順番に実行されるため、左端の原則を満たす必要があります。したがって
、where条件で使用されるフィールドの順序は、selectステートメントを使用するときに複合インデックスの順序と一致する必要があります。クエリを実行します。そうしないと、インデックスが有効になりません。
CREATE TABIE 表名(列名1 数据类型,列名2 数据类型,列名3 数据类,INDEX 索引名 (列名1,列名2,列名3));
select * from 表名 where 列名1='...' AND 列名2='...' AND 列名3='...';
5.5全文索引(FULLTEXT)
ファジークエリに適しており、記事内のテキスト情報を取得するために使用できます。MySQT5.6バージョンより前では、
FULLTEXTインデックスはMyISAMエンジンでのみ使用できます。バージョン5.6以降、innodbエンジンはFULLTEXTインデックスもサポートします。
フルテキストインデックスは、CHAR、VARCHAR、またはTEXTタイプの列に作成できます。テーブルごとに許可されるフルテキストインデックスは1つだけです。
- インデックスを直接作成する
CREATF FULLTEXT INDEX 索引名 ON 表名 (列名);
- テーブルを変更して作成する
ALTER TABLE 表名 ADD FULLTEXT 索引名 (列名);
- テーブル作成時にインデックスを指定します
CREATE TABLE 表名(字段1 数据类型[,...], FULLTEXT 索引名 (列名));
データ型は、CHAR、VARCHAR、またはTEXTです。
- 全文索引クエリを使用する
SELECT * FROM 表名 WHERE MATCH(列名) AGAINST ('查询内容');
6、インデックスを表示
show index from 表名;
show index from 表名\G; 竖向显示表索引信息
show keys from 表名;
show keys from 表名\G;
各フィールドの意味は次のとおりです。
テーブル | テーブルの名前 |
---|---|
Non_unique | インデックスに繰り返し単語を含めることができない場合は0、可能な場合は1です。 |
Key_name | インデックスの名前 |
seq_in_index | 1から始まるインデックスの列番号 |
Co1umn_name | 列名 |
照合 | 列がインデックスに格納される方法。MysQLには、値 '、'(昇順)またはNULL(分類なし)があります。 |
カーディナリティ | インデックス内の一意の値の推定数 |
Sub_part | 列が部分的にのみ索引付けされている場合、それは索引付けされている文字数です。列全体にインデックスが付けられている場合、それはNOLLです |
パック | キーワードの圧縮方法を示します。圧縮されていない場合はNULL |
ヌル | 列にNULLが含まれている場合、その列にはYESが含まれています。そうでない場合、列にはNOが含まれます |
Index_type | 使用されるインデックスメソッド(BTREE、FULLTEXT、HASH、RIREE) |
コメント | 備考 |
セブン、インデックスを削除します
- インデックスを直接削除する
DROP INDEX 索引名 ON 表名;
- テーブルを変更してインデックスを削除します
ALTER TABLE 表名 DROP INDEX 索引名;
- 主キーインデックスを削除します
ALTER TABLE 表名 DROP PRIMARY KEY;