MySQLデータベースインデックスのタイプ、作成、および削除

MySQLデータベースインデックスのタイプ、作成、および削除

MySQLインデックス

●インデックスはソートされたリストであり、インデックスの値とこの値を含むデータの行の物理アドレスが格納されます(C言語のリンクリストと同様に、ポインタを介してデータレコードのメモリアドレスを指します) )。
●インデックスを使用した後、行のデータを見つけるためにテーブル全体をスキャンする必要はありませんが、最初にインデックステーブルからデータの行に対応する物理アドレスを見つけてから、対応するデータにアクセスします。データベースのクエリ速度を高速化します。
●索引は本の目次のようなもので、目次のページ番号から必要な内容をすばやく見つけることができます。
●インデックスは、テーブル内の1つまたは複数の列の値を並べ替える方法です。
●インデックス作成の目的は、テーブル内のレコードの検索または並べ替えを高速化することです。

1.1インデックスの役割

●適切なインデックスを設定した後、データベースはさまざまな高速測位技術を使用してクエリ速度を大幅に高速化します。これがインデックスを作成する主な理由です。
●テーブルが非常に大きい場合、またはクエリに複数のテーブルが含まれる場合、インデックスを使用すると、クエリの速度が数千倍になる可能性があります。
●データベースのIOコストを削減でき、インデックスはデータベースのソートコストも削減できます。
●一意のインデックスを作成することにより、データテーブル内のデータの各行の一意性を保証できます。
●テーブルとテーブル間の接続を高速化できます。
●グループ化と並べ替えを使用すると、グループ化と並べ替えの時間を大幅に短縮できます。

1.2インデックス作成の副作用

●インデックスには追加のディスク容量が必要です。
MyISAMエンジンの場合、インデックスファイルとデータファイルは分離され、インデックスファイルはデータレコードのアドレスを保存するために使用されます。InnoDBエンジンテーブルデータファイル自体がインデックスファイルです。
●インデックスも変更されるため、データの挿入や変更に時間がかかります。

1.3インデックスを作成するための主な根拠

インデックスはデータベースクエリの速度を上げることができますが、すべての状況でインデックスを作成するのに適しているわけではありません。インデックス自体がシステムリソースを消費するため、インデックスがある場合、データベースは最初にインデックスクエリを実行し、次に特定のデータ行を見つけます。インデックスが不適切に使用されると、データベースの負担が増大します。
●テーブルの主キーと外部キーにはインデックスが必要です。主キーは一意であるため、外部キーはメインテーブルの主キーに関連付けられており、クエリを実行するときにすばやく見つけることができます。
●300行を超えるレコードがあるテーブルには、インデックスが必要です。インデックスがない場合は、クエリごとにテーブルをトラバースする必要があります。これは、データベースのパフォーマンスに深刻な影響を及ぼします。
●他のテーブルに頻繁に接続されるテーブルの場合、接続フィールドにインデックスを設定する必要があります。
●一意性の低いフィールドは、インデックス作成には適していません。
●頻繁に更新されるフィールドは、インデックス作成には適していません。
●where句に頻繁に表示されるフィールド、特に大きなテーブルのフィールドには、インデックスを付ける必要があります。
●インデックスは、選択性の高いフィールドに基づいて作成する必要があります。
●インデックスは小さなフィールドに作成する必要があります。大きなテキストフィールドや長いフィールドにもインデックスを作成しないでください。

第二に、インデックスの分類と作成

create table member (id int(10),name varchar(10),cardid varchar(10),phone int(11),address varchar(50),remark text);

ここに画像の説明を挿入します
ここに画像の説明を挿入します

2.1通常のインデックス

最も基本的なインデックスタイプであり、一意性などの制限はありません。

2.1.1インデックスを直接作成する

CREATE INDEX 索引名 ON 表名(列名[ (length)]);

#(列名(length)):length是可选项,下同。如果忽略length的值,则使用整个列的值作为索引。如果指定使用列的前length个字符来创建索引,这样有利于减小索引文件的大小。
#索引名建议以“index"结尾。

create index name_index on member (name);
show create table member;
show index from member;
show keys from member;

ここに画像の説明を挿入します

2.1.2テーブル作成の変更

ALTER TABLE 表名 ADD INDEX 索引名 (列名);

alter table member add INDEX cardid_index (cardid);
select cardid from member;      #自动进行排序

ここに画像の説明を挿入します
ここに画像の説明を挿入します

2.1.3テーブルを作成するときにインデックスを指定する

CREATE TABLE 表名 (字段1 数据类型,字段2 数据类型[,...],INDEX 索引名 (列名));

ここに画像の説明を挿入します

2.2一意のインデックス

通常のインデックスと似ていますが、一意のインデックス列の各値が一意である点が異なります。一意のインデックスはnull値を許可します(主キーとは異なることに注意してください)。複合インデックスを使用して作成されている場合、列値の組み合わせは一意である必要があります。添加唯一键将自动创建唯一索引。

2.2.1一意のインデックスを直接作成する

CREATE UNIQUE INDEX 索引名 ON 表名 (列名);
create unique index cardid_index on member(cardid);

ここに画像の説明を挿入します

2.2.2テーブルメソッドを変更してインデックスを作成する

ALTER TABLE 表名 ADD UNIQUE 索引名 (列名);

ここに画像の説明を挿入します

2.2.3テーブルを作成するときにインデックスを指定する

CREATE TABLE 表名 (字段1 数据类型,字段2 数据类型[,...],UNIQUE 索引名 (列名));

ここに画像の説明を挿入します

2.3主キーインデックス

これは特別な一意のインデックスであり、「PRIMARYKEY」として指定する必要があります。テーブルは主キーを1つだけ持つことができ、null値は許可されません。添加主键将自动创建主键索引。

2.3.1テーブル作成時にインデックスを指定する

CREATE TABLE 表名([...],PRIMARY KEY (列名));

ここに画像の説明を挿入します

2.3.2テーブルメソッドを変更してインデックスを作成する

ALTER TABLE 表名 ADD PRIMARY KEY (列名);
alter table member add primary key (id);

ここに画像の説明を挿入します

2.4複合インデックス(単一列インデックスと複数列インデックス)

これは、単一の列で作成されたインデックスでも、複数の列で作成されたインデックスでもかまいません。selectステートメントのwhere条件は左から右に順番に実行されるため、左端の原則を満たす必要があります。使用select 语句查询时where条件使用的字段顺序必须和组合索引中的排序一致,否则索引将不会生效。

CREATE TABLE 表名 (列名1 数据类型,列名2 数据类型,列名3 数据类型, INDEX 索引名 (列名1, 列名2,列名3));
select * from 表名 where 列名1='...' AND 列名2='...' AND 列名3=';

2.5フルテキストインデックス(FULLTEXT)

ファジークエリに適しており、記事内のテキスト情報を取得するために使用できます。MySQLバージョン5.6より前では、FULLTEXTインデックスはMyISAMエンジンでのみ使用できます。バージョン5.6以降、innodbエンジンはFULLTEXTインデックスもサポートします。全文索引可以在CHAR、VARCHAR 或者TEXT类型的列上创建。每个表只允许有一个全文索引。

2.5.1インデックスを直接作成する

CREATE FULLTEXT INDEX 索引名 ON 表名 (列名);

ここに画像の説明を挿入します

2.5.2テーブル作成の変更

ALTER TABLE 表名 ADD FULLTEXT 索引名 (列名);
alter table member add fulltext remark_index (remark);

ここに画像の説明を挿入します
ここに画像の説明を挿入します

2.5.3テーブル作成時にインデックスを指定する

CREATE TABLE 表名 (字段1 数据类型[...], FULLTEXT 索引名 (列名));
#数据类型可以为CHAR、VARCHAR 或者TEXT

ここに画像の説明を挿入します

2.5.4フルテキストインデックスクエリを使用する

SELECT * FROM 表名 WHERE MATCH(列名) AGAINST('查询内容');

insert into member2 values(1,'zhangsan',123123,123123,'nanjing','this is test!');
insert into member2 values(2,'lisi',456456,456456,'beijing','this is xyw!');
insert into member2 values(3,'wangwu',789789,78979,'shanghai','this is xyw test!');
select * from member2 where match(remark) against('test');

ここに画像の説明を挿入します
ここに画像の説明を挿入します
ここに画像の説明を挿入します

2.6インデックスを表示

show index from 表名;
show keys from 表名;

ここに画像の説明を挿入します
ここに画像の説明を挿入します

2.6.1各フィールドの意味

Table:表的名称。
Non_unique:如果索引不能包括重复词,则为0;如果可以,则为1。
Key_name:索引的名称。
Seq_in_index:索引中的列序号,从1开始。
Column_name:列名称。
Collation:列以什么方式存储在索引中。在MySQL中,有值'A'(升序)或NULL(无分类)。
Cardinality:索引中唯一值数目的估计值。
Sub_part:如果列只是被部分地编入索引,则为被编入索引的字符的数目。如果整列被编入索引,则为NULL.
Packed:指示关键字如何被压缩。如果没有被压缩,则为NULL。
Null:如果列含有NULL, 则含有YES。如果没有,则该列含有NO。
Index_type:用过的索引方法( BTREE,FULLTEXT, HASH, RTREE) 。
Comment:备注。

2.7インデックスの削除

2.7.1インデックスを直接削除する

DROP INDEX 索引名 ON 表名;

ここに画像の説明を挿入します
ここに画像の説明を挿入します
ここに画像の説明を挿入します

2.7.2インデックスを削除するようにテーブルメソッドを変更する

ALTER TABLE 表名 DROP INDEX 索引名;

ここに画像の説明を挿入します

2.7.3主キーインデックスを削除します

ALTER TABLE 表名 DROP PRIMARY KEY;

ここに画像の説明を挿入します

3、ケース

たとえば、ショッピングモールの会員カードシステムを作成します。このシステムには、次のフィールドを持つメンバーシップテーブルがあります。

会员编号 INT
会员姓名 VARCHAR(10)
会员身份证号码 VARCHAR(18) 
会员电话 INT(11)
会员住址 VARCHAR(50)
会员备注信息 TEXT
create table member (id int(10),name varchar(10),cardid varchar(10),phone int(11),address varchar(50),remark text);
alter table member add primary key (id);
create index name_index on member (name);
create unique index cardid_index on member (cardid);
alter table member add fulltext remark_index (remark);

ここに画像の説明を挿入します

次に、メンバーシップ番号を主キーとして、PRIMARY KEY
メンバー名を使用します。インデックスを作成する場合は、通常のINDEX
メンバーID番号です。インデックスを作成する場合は、UNIQUE(unique、no繰り返し)
メンバーのコメント、インデックスを作成する必要がある場合は、全文検索、全文検索を選択できます。
ただし、FULLTEXTは、長い記事を検索する場合に最適に機能します。比較的短いテキストで使用され、1行または2行しかない場合は、通常のINDEXも使用できます。

おすすめ

転載: blog.csdn.net/IvyXYW/article/details/113645904