MySQLインデックス、トランザクション、およびストレージエンジン(詳細な解釈)

MySQLインデックス、トランザクション、およびストレージエンジン(詳細な解釈)

1つはMySQLインデックス

(1)インデックスの概念

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

(2)インデックスの役割

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

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

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

(3)インデックス作成の原則

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

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

1.通常のインデックス

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

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

●インデックスを直接作成する
CREATEINDEXインデックス名ONテーブル名(列名[(長さ)]);
#(列名(長さ)):長さはオプションで、以下と同じです。lengthの値を省略すると、列全体の値がインデックスとして使用されます。列の前の長さ文字を使用してインデックスを作成するように指定すると、インデックスファイルのサイズを小さくするのに役立ちます。
#Index名は「_index」で終わることをお勧めします。

show create table member; #查看索引具体情况

ここに画像の説明を挿入
ここに画像の説明を挿入
ここに画像の説明を挿入
ここに画像の説明を挿入

●修改表方式创建
ALTER TABLE 表名 ADD INDEX 索引名 (列名);

ここに画像の説明を挿入

ここに画像の説明を挿入

●创建表的时候指定索引
CREATE TABLE 表名 ( 字段1 数据类型,字段2 数据类型[,...],INDEX 索引名 (列名));

2.一意のインデックス

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

●直接创建唯一索引:
CREATE UNIQUE INDEX 索引名 ON 表名(列名);
create unique index cardid_index on member (cardid);
●修改表方式创建
ALTER TABLE 表名 ADD UNIQUE 索引名 (列名);
show create table member; #查看索引具体情况

ここに画像の説明を挿入

ここに画像の説明を挿入

●创建表的时候指定
CREATE TABLE 表名 (字段1 数据类型,字段2 数据类型[,...],UNIQUE 索引名 (列名));

3.主キーインデックス

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

●创建表的时候指定
CREATE TABLE 表名 ([...],PRIMARY KEY (列名));
●修改表方式创建
ALTER TABLE 表名 ADD PRIMARY KEY (列名); 

ここに画像の説明を挿入
ここに画像の説明を挿入

4.複合インデックス

(単一列インデックスおよび複数列インデックス):単一の列で作成されたインデックス、または複数の列で作成されたインデックスの場合があります。左端の原則を満たす必要があります。selectステートメントのwhere条件は左から右に順番に実行されるため、where条件で使用されるフィールドの順序は、selectステートメントを使用する場合の複合インデックスの順序と一致している必要があります。クエリを実行します。そうしないと、インデックスが有効になりません。

CREATE TABLE 表名 (列名1 数据类型,列名2 数据类型,列名3 数据类型,INDEX 索引名 (列名1,列名2,列名3));
alter table member add index mem_index (phone,address);

ここに画像の説明を挿入

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

ここに画像の説明を挿入

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

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

●直接创建索引
CREATE FULLTEXT INDEX 索引名 ON 表名 (列名);
●修改表方式创建
ALTER TABLE 表名 ADD FULLTEXT 索引名 (列名);

ここに画像の説明を挿入
ここに画像の説明を挿入

●创建表的时候指定索引
CREATE TABLE 表名 (字段1 数据类型[,...],FULLTEXT 索引名 (列名));
#数据类型可以为 CHAR、VARCHAR 或者 TEXT
●使用全文索引查询
SELECT * FROM 表名 WHERE MATCH(列名) AGAINST('查询内容');

ここに画像の説明を挿入

6.インデックスを表示する

show index from 表名;
show keys from 表名;
show index from member\G; #竖列显示

各フィールドの意味は次のとおりです。

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

ここに画像の説明を挿入

7、インデックスを削除します

show create table member; 
#删之前先查一下

ここに画像の説明を挿入

●直接删除索引
DROP INDEX 索引名 ON 表名;

ここに画像の説明を挿入

ここに画像の説明を挿入

●修改表方式删除索引
ALTER TABLE 表名 DROP INDEX 索引名;

ここに画像の説明を挿入

●删除主键索引
ALTER TABLE 表名 DROP PRIMARY KEY;

ここに画像の説明を挿入

ケース:たとえば、ショッピングモールの会員カードシステムを構築します。このシステムには、次のフィールドを持つメンバーシップテーブルがあります。
メンバーシップ番号INT
メンバー名VARCHAR(10)
メンバーID番号VARCHAR(18)
メンバー電話VARCHAR(10)
メンバーアドレスVARCHAR(50)
メンバー備考情報TEXT
、次にメンバー番号、プライマリとしてkey、PRIMARY KEY
メンバー名を使用します。インデックスを作成する場合は、通常のINDEX
メンバーID番号です。インデックスを作成する場合は、UNIQUE(一意、重複なし)
メンバーコメントを選択できます。インデックスを作成する必要があります。FULLTEXT、全文検索を選択できます。
ただし、FULLTEXTは、長い記事を検索する場合に最適です。比較的短いテキストで使用され、1行または2行しかない場合は、通常のINDEXも使用できます。

つづく

おすすめ

転載: blog.csdn.net/weixin_51573771/article/details/113188467