MySQLインデックス、トランザクション、およびストレージエンジン(詳細なグラフィックとテキスト!)(1)

MySQLインデックス、トランザクション、およびストレージエンジン(詳細なグラフィックとテキスト!)(1)


準備:最初にデータベースとテーブルを作成します

mysql -u root -p

create database SCHOOL;
use SCHOOL;
create table class (id int(10) not null,name varchar(10) not null,cardid varchar(18),phone varchar(11),address varchar(50));

desc class;

insert into class values (1,'zhangsan','12','111111','nanjing');
insert into class values (4,'lisi','123','444444','suzhou');
insert into class values (2,'wangwu','1234','222222','beijing');
insert into class values (5,'zhaoliu','12345','555555','nanjing');
insert into class values (3,'qianqi','123456','333333','shanghai');

select * from class;

ここに画像の説明を挿入

データを挿入し、テーブル構造を表示します

ここに画像の説明を挿入

1つはMySQLインデックス

1.インデックスの概念

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

2.インデックスの役割

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

3.インデックス作成の副作用

1)インデックスには追加のディスク容量が必要です。

  • MyISAMエンジンの場合、インデックスファイルとデータファイルは分離され、インデックスファイルはデータレコードのアドレスを保存するために使用されます。
  • InnoDBエンジンテーブルデータファイル自体がインデックスファイルです。

2)インデックスもそれに応じて変更されるため、データの挿入と変更に時間がかかります。

4.インデックスを作成するための主な基礎

インデックスはデータベースクエリの速度を上げることができますが、すべての状況でインデックスを作成するのに適しているわけではありません。インデックス自体がシステムリソースを消費するため、インデックスがある場合、データベースは最初にインデックスクエリを実行し、次に特定のデータ行を見つけます。インデックスが不適切に使用されると、データベースの負担が増大します。

1)テーブルの主キーと外部キーにはインデックスが必要です。主キーは一意であるため、外部キーはメインテーブルの主キーに関連付けられており、クエリを実行するときにすばやく見つけることができます。
2)300行を超えるレコードを持つテーブルには、インデックスが必要です。インデックスがない場合は、クエリごとにテーブルをトラバースする必要があります。これは、データベースのパフォーマンスに深刻な影響を及ぼします。
3)他のテーブルに頻繁に接続されるテーブルの場合、接続フィールドにインデックスを設定する必要があります。
4)一意性の低いフィールドは、インデックス付けには適していません。
5)頻繁に更新されるフィールドは、インデックスの作成には適していません。
6)where句に頻繁に現れるフィールド、特に大きなテーブルのフィールドには、インデックスを付ける必要があります。
7)インデックスは、選択性の高いフィールドに基づいて作成する必要があります。
8)インデックスは小さなフィールドに作成する必要があります。大きなテキストフィールドや長いフィールドにもインデックスを作成しないでください。

(1)インデックスの分類と作成

1.通常のインデックス

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

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

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

例:
create index phone_index on class (phone);
show keys from class\G;

ここに画像の説明を挿入

1.2テーブル作成の変更

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

例:
alter table class add index id_index (id);
show keys from class\G;

ここに画像の説明を挿入

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

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

例:
create table test(
id int(10) not null,
name varchar(20) not null,
index id_index (id));

show keys from test\G;

ここに画像の説明を挿入

2.一意のインデックス

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

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

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

例:
create unique index address_index on class(address);
create unique index id_index on class(id);

show keys from class\G;

ここに画像の説明を挿入

2.2テーブル作成の変更

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

例:
alter table class add unique cardid_index (cardid);
show keys from class\G;

ここに画像の説明を挿入

2.3テーブル作成時に指定する

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

例:
create table test01(
id int(10) not null,
name varchar(20) not null,
unique id_index (id));

show keys from test01\G;

ここに画像の説明を挿入

3.主キーインデックス

  • これは特別な一意のインデックスであり、「PRIMARYKEY」として指定する必要があります。テーブルは主キーを1つだけ持つことができ、null値は許可されません。主キーを追加すると、主キーインデックスが自動的に作成されます。

3.1テーブル作成時に指定する

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

例:
create table test02(
id int(10) not null,
name varchar(20) not null,
primary key (id));
或
create table test03(id int(10) not null primary key,name varchar(20) not null);

show keys from test02\G;
show keys from test03\G;

ここに画像の説明を挿入

3.2テーブル作成の変更

ALTER TABLE 表名 ADD PRIMARY KEY (列名); 

例:
alter table class add primary key(id);
show keys from class\G;

ここに画像の説明を挿入

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

  • これは、単一の列で作成されたインデックスでも、複数の列で作成されたインデックスでもかまいません。左端の原則を満たす必要があります。selectステートメントのwhere条件は左から右に順番に実行されるため、where条件で使用されるフィールドの順序は、selectステートメントを使用する場合の複合インデックスの順序と一致している必要があります。クエリを実行します。そうしないと、インデックスが有効になりません。
CREATE TABLE 表名 (列名1 数据类型,列名2 数据类型,列名3 数据类型,INDEX 索引名 (列名1,列名2,列名3));

select * from 表名 where 列名1='...' AND 列名2='...' AND 列名3='...';

例:
create table test04(id int(10) not null,
name varchar(20) not null,
sex char(2) not null,
index index_amd (id,name));

show keys from test04\G;

insert into test04 values(1,'zhangsan','男');
select * from test04 where id=1 and name='zhangsan';
select * from test04 where id=1;
select * from test04 where name='zhangsan' and id=1;

ここに画像の説明を挿入

ここに画像の説明を挿入

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

  • ファジークエリに適しており、記事内のテキスト情報を取得するために使用できます。
  • MySQL 5.6バージョンより前のFULLTEXTインデックスは、MyISAMエンジンでのみ使用できます。
  • バージョン5.6以降、innodbエンジンはFULLTEXTインデックスもサポートします。
  • フルテキスト索引は、タイプCHAR、VARCHAR、またはTEXTの列に作成できます。テーブルごとに許可されるフルテキストインデックスは1つだけです。

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

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

例:
create fulltext index cardid_index on class (cardid);

ここに画像の説明を挿入

5.2テーブル作成の変更

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

例:
alter table class add fulltext cardid_index (cardid);

ここに画像の説明を挿入

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

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

例:
create table test05(
id int(10) not null,
name varchar(20) not null,
address varchar(50),
fulltext address_full(address));

insert into test05 values ('1','zhangsan','shanghai');
insert into test05 values ('2','lisi','shanghai');
insert into test05 values ('3','wangwu','nanjing');

ここに画像の説明を挿入

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

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

例:
select * from test05 where match(address) against('shanghai');

ここに画像の説明を挿入

(2)インデックスを表示する

#两个命令查看的信息一样,选其一即可。
show index from 表名;
或者
show keys from 表名;
#---------------查看后个字段的解释----------------------------------------------------
各字段的含义如下:
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:备注。

ここに画像の説明を挿入

ここに画像の説明を挿入

(3)インデックスを削除します

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

DROP INDEX 索引名 ON 表名;
例:
drop index phone_index on class;

ここに画像の説明を挿入

3.2テーブルを変更してインデックスを削除します

ALTER TABLE 表名 DROP INDEX 索引名;
例:
alter table class drop index id_index;

ここに画像の説明を挿入

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

ALTER TABLE 表名 DROP PRIMARY KEY;
例:
alter table class drop primary key;

ここに画像の説明を挿入

おすすめ

転載: blog.csdn.net/qq_35456705/article/details/113949716