mysqlインデックスとはどういう意味ですか

青灯夜游
リリース: 2023-04-13 16:13:29
オリジナル
2270 人が閲覧しました

mysql では、インデックスは「インデックス」を指します。これは、データ テーブル内の 1 つ以上の列で構成される特別なデータベース構造です。データ テーブル内の特定の列をすばやくクエリするために使用できます。値レコード。インデックスを介してデータをクエリする場合、レコードのすべての情報を読み取る必要はなく、インデックス列をクエリするだけで済みます。そうでない場合、データベース システムは照合のために各レコードのすべての情報を読み取ります。したがって、インデックスを使用すると、データベースのクエリ速度が大幅に向上し、データベース システムのパフォーマンスが効果的に向上します。

mysqlインデックスとはどういう意味ですか

このチュートリアルの動作環境: Windows7 システム、mysql8 バージョン、Dell G3 コンピューター。

mysql では、インデックスは「インデックス」を指します。これは、データ テーブル内の 1 つ以上の列で構成される特別なデータベース構造です。データ テーブル内の特定の列をすばやくクエリするために使用できます。値レコード。

インデックスを使用してデータをクエリする場合、レコード内のすべての情報を読み取る必要はなく、インデックス列をクエリするだけで済みます。それ以外の場合、データベース システムは照合のために各レコードのすべての情報を読み取ります。

この索引は、新華辞典の発音順序と比較できます。たとえば、「く」という単語を調べたい場合、発音順序を使用しない場合、400 ページの辞書からページごとに検索する必要があります。ただし、ピンインを抽出して発音シーケンスを作成する場合は、10 ページを超える発音表から直接検索するだけで済みます。これにより時間を大幅に節約できます。

したがって、インデックスを使用すると、データベースのクエリ速度が大幅に向上し、データベース システムのパフォーマンスが効果的に向上します。

インデックスを使用する理由

インデックスとは、列の値とレコード行の間の関係を、ある基準に基づいて特定の順序で確立したものです。対応テーブルは基本的に、インデックス列の列値と元のテーブルのレコード行の間の 1 対 1 の対応を記述する順序付けされたテーブルです。

インデックスは MySQL の非常に重要なデータベース オブジェクトであり、データベース パフォーマンス チューニング テクノロジの基礎であり、データの高速な取得を実現するためによく使用されます。

MySQL では、通常、データベース テーブルの行データにアクセスする方法が 2 つあります。

1) シーケンシャル アクセス

シーケンシャル アクセスは、データベース テーブルに対してフル テーブル スキャンを実行することです。テーブル。順序なし行データの条件を満たすターゲット データが見つかるまで、最初から最後まで 1 行ずつ調べます。

シーケンシャル アクセスは実装が比較的簡単ですが、テーブル内に大量のデータがある場合、効率は非常に低くなります。例えば、数千万のデータの中から少量のデータを検索する場合、シーケンシャルアクセスを行うと全データを横断することになり、時間がかかり、データベースの処理性能に影響を与えるのは明らかです。

2) インデックス アクセス

インデックス アクセスは、インデックスを走査してテーブル内のレコード行に直接アクセスする方法です。

この方法を使用する前提は、テーブルにインデックスを作成することです。列にインデックスを作成した後、データを検索するときに、テーブルのインデックスに基づいて、対応するレコード行の位置を直接見つけることができます。列をクリックすると、データをすばやく見つけることができます。インデックスは、指定された列のデータ値へのポインターを格納し、指定された並べ替え順序に従ってこれらのポインターを並べ替えます。

たとえば、学生基本情報テーブル tb_students で、student_id に基づいてインデックスが設定されている場合、システムはインデックス列から実際のレコードまでのマッピングテーブルを作成します。ユーザーが Student_id 12022 のデータを検索する必要がある場合、システムはまず Student_id インデックスでレコードを検索し、次にマッピング テーブルを通じてデータ行を直接検索し、データ行を返します。一般に、インデックスのスキャン速度は実際のデータ行のスキャン速度よりもはるかに速いため、インデックスを使用するとデータベースの効率が大幅に向上します。

つまり、インデックスを使用せずに、MySQL は最初のレコードから始めて、関連する行が見つかるまでテーブル全体を読み取る必要があります。テーブルが大きくなるほど、データのクエリにかかる時間が長くなります。テーブル内のクエリ対象のカラムにインデックスがある場合、MySQL はすべてのデータを確認することなく、データ ファイルを検索する場所にすぐにアクセスできるため、時間を大幅に節約できます。

インデックスの利点と欠点

インデックスには明らかな利点と避けられない欠点があります。

利点

インデックスの利点は次のとおりです。

  • 一意のインデックスを作成することにより、データの各行がデータベーステーブルが一意であることが保証されます。

  • すべての MySQL 列タイプにインデックスを設定できます。

  • を使用すると、データ クエリを大幅に高速化できます。これがインデックスを使用する主な理由です。

  • データの参照整合性を実現するという点で、テーブル間の接続を高速化できます。

  • #データ クエリにグループ化句と並べ替え句を使用すると、クエリ内のグループ化と並べ替えの時間を大幅に短縮することもできます

# #欠点

インデックスを増やすと、主に次のような多くの欠点もあります。

    インデックス グループの作成と維持に時間がかかり、データ量が増えるため、時間がかかります。増えると時間がかかります。
  • インデックスはディスク領域を占有する必要があります。データ テーブルが占有するデータ領域に加えて、各インデックスは一定量の物理領域も占有します。多数のインデックスがある場合、インデックス ファイルはデータ ファイルよりも早く最大ファイル サイズに達する可能性があります。
  • テーブル内のデータが追加、削除、変更されると、インデックスも動的に維持する必要があるため、データのメンテナンス速度が低下します。

インデックスを使用する場合は、インデックスの長所と短所を考慮する必要があります。

インデックスを使用するとクエリの速度が向上しますが、レコードの挿入速度に影響します。インデックス付きテーブルにレコードを挿入するとき、データベース システムはインデックスに従って並べ替えるため、レコードの挿入速度が低下します。大量のレコードを挿入する場合、速度への影響はより顕著になります。この場合、最初にテーブル内のインデックスを削除し、次にデータを挿入し、挿入が完了した後にインデックスを作成するのが最善の方法です。

インデックス設計の原則

1) インデックスはディスク領域も占有するため、多いほど良いことに注意してください。

2) インデックスが多すぎると、INSERT、DELETE、UPDATE などのステートメントの実行効率に影響します。

3) データが少なすぎる場合、インデックスを作成することはお勧めできません。

4) 一意制約の場合は、対応する一意のインデックスを使用する必要があります。

5) 識別性の低いフィールドにはインデックスを付けないように注意してください。たとえば、列挙型の性別フィールドには男性と女性のみが含まれるため、最適化効果は得られません。

6) テーブル作成時にインデックスを作成することをお勧めします。テーブルに多数のレコードがある場合、列がインデックスとして作成された後、テーブル内のすべてのレコードが変更されます。

7) 頻繁にクエリされないフィールドにインデックスを作成することはお勧めできません。

#インデックス タイプ

タイプ関数##通常のインデックス一意のインデックス主キー インデックス複合インデックスさまざまな環境に応じて、対応するインデックス タイプを選択するだけです。
基本的なインデックス作成方法、特別な手順なし
データは一意であり、null が許可されます
テーブルには主キーが 1 つだけあり、データは一意であり、NULL は許可されません
2 つ以上の列を含めることができるインデックス メソッド

インデックスの作成構文通常のインデックスを例として、テーブルの作成時にインデックスを作成します

create table 表名(
 字段定义…
 index 索引名称(字段));
ログイン後にコピー

通常のインデックスを例として取り上げます, テーブルを変更します。インデックス

alter table 表名 add index 索引名称(字段);
ログイン後にコピー

については、インデックスの代わりにキーを使用でき、インデックス名は省略できます。インデックス名を追加しない場合は、デフォルトでフィールド名がインデックス名として使用されます。

通常のインデックス特に注意する必要のない、最も基本的なインデックス作成方法です。

テーブルを作成し、通常のインデックスを作成します。インデックス列は id

mysql> create table test1(id int,name varchar(5),age tinyint,index index_id(id));
ログイン後にコピー

です。テーブルの構造を表示します。キーの下の MUL は通常のインデックスを表します

mysql> desc test1;
+-------+------------+------+-----+---------+-------+
| Field | Type       | Null | Key | Default | Extra |
+-------+------------+------+-----+---------+-------+
| id    | int(11)    | YES  | MUL | NULL    |       |
| name  | varchar(5) | YES  |     | NULL    |       |
| age   | tinyint(4) | YES  |     | NULL    |       |
+-------+------------+------+-----+---------+-------+
ログイン後にコピー

インデックス情報を表示します

mysql> show index from test1\G
*************************** 1. row ***************************
        Table: test1
   Non_unique: 1
     Key_name: index_id		
 Seq_in_index: 1
  Column_name: id
    Collation: A
  Cardinality: 0
     Sub_part: NULL
       Packed: NULL
         Null: YES
   Index_type: BTREE
      Comment:
Index_comment:
      Visible: YES
   Expression: NULL
1 row in set (0.00 sec)
ログイン後にコピー

テスト用にテーブルにデータを追加します。

mysql> insert into test1 values(1,'张三',21),(2,'李四',22),(3,'王五',23),(4,'赵六',24);
ログイン後にコピー

最初にインデックスを経由せずに、

explain

を通じて SQL クエリ ステートメントの実行をシミュレートし、という名前のレコードをクエリします。趙劉。

mysql> explain select * from test1 where name='赵六'\G
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: test1
   partitions: NULL
         type: ALL
possible_keys: NULL
          key: NULL
      key_len: NULL
          ref: NULL
         rows: 4
     filtered: 25.00
        Extra: Using where
1 row in set, 1 warning (0.00 sec)
ログイン後にコピー
type:ALL 項目はテーブル全体のスキャンを示し、行数: 4 は行数を示します。 Zhao Liu はテーブルの最後のレコードであるため、クエリはテーブル全体をスキャンします。

次に、インデックス列 ID を使用して Zhao Liu という名前のフィールドをクエリします。

mysql> explain select * from test1 where id=4\G
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: test1
   partitions: NULL
         type: ref
possible_keys: index_id
          key: index_id
      key_len: 5
          ref: const
         rows: 1
     filtered: 100.00
        Extra: NULL
1 row in set, 1 warning (0.00 sec)
ログイン後にコピー

rows: 1 は、1 行のみが取得され、レコードが見つかったことを意味します。判定は明らかです。

一意のインデックス一意のインデックスでは、インデックス列のデータは一意であり、重複する値は出現できません。コンテンツを制限するために使用され、null 値を許可します。

構文:

create table 表名(
 字段定义…
 unique key 索引名(字段名));
ログイン後にコピー

一意のインデックスは、値を繰り返すことができないフィールド、ID 番号、携帯電話番号などでよく使用されます。

テーブルを作成し、一意のインデックスを作成します。インデックス列は携帯電話番号です。

mysql> create table test2(id int,name varchar(5),phone int,unique key unique_key_phone(phone));
ログイン後にコピー

テーブル構造を表示します。キーの下の UNI は一意のインデックスとして表されます

mysql> desc test2;
+-------+------------+------+-----+---------+-------+
| Field | Type       | Null | Key | Default | Extra |
+-------+------------+------+-----+---------+-------+
| id    | int(11)    | YES  |     | NULL    |       |
| name  | varchar(5) | YES  |     | NULL    |       |
| phone | int(11)    | YES  | UNI | NULL    |       |
+-------+------------+------+-----+---------+-------+
ログイン後にコピー

データを挿入して機能をテストします

mysql> insert into test2 values(1,'张三',1111111111);
mysql> insert into test2 values(2,'李四',null);	#可以为null
mysql> insert into test2 values(3,'王五',1111111111);	#值必须唯一
ERROR 1062 (23000): Duplicate entry '1111111111' for key 'unique_key_phone'
ログイン後にコピー

テーブル データを表示

mysql> select * from test2;
+------+--------+------------+
| id   | name   | phone      |
+------+--------+------------+
|    2 | 李四   |       NULL |
|    1 | 张三   | 1111111111 |
+------+--------+------------+
ログイン後にコピー

主キーインデックス主キーインデックスは主キーを設定するもので、各テーブルには主キーを 1 つだけ持つことができます。主キー列の値は一意である必要があり、NULL 値は許可されません。

構文:

create table テーブル名 (フィールド主キー);
または

create table テーブル名 (

フィールド定義) …

主キー インデックス名 (フィールド));

テーブルを作成し、それを主キー インデックスとして設定します。インデックス列は id

mysql> create table test3(id int primary key,name varchar(5),age tinyint);
ログイン後にコピー

です。テーブル構造を表示します。キー主キー インデックス列

mysql> desc test3;
+-------+------------+------+-----+---------+-------+
| Field | Type       | Null | Key | Default | Extra |
+-------+------------+------+-----+---------+-------+
| id    | int(11)    | NO   | PRI | NULL    |       |
| name  | varchar(5) | YES  |     | NULL    |       |
| age   | tinyint(4) | YES  |     | NULL    |       |
+-------+------------+------+-----+---------+-------+
ログイン後にコピー

データとテスト機能の挿入

mysql> insert into test3 values(1,'张三',23);
mysql> insert into test3 values(null,'张三',23);	#不能为null
ERROR 1048 (23000): Column 'id' cannot be null
mysql> insert into test3 values(1,'张三',23);	#值不能重复
ERROR 1062 (23000): Duplicate entry '1' for key 'PRIMARY'
ログイン後にコピー

テーブル データの表示

mysql> select * from test3;
+----+--------+------+
| id | name   | age  |
+----+--------+------+
|  1 | 张三   |   23 |
+----+--------+------+
ログイン後にコピー

複合インデックス 複合インデックスには 2 つ以上の列を含めることができます。

特別な構文はありません。テーブルの二重インデックスを作成できます。

テーブルを作成し、それを複合主キーとして設定します。インデックス列は id、name

mysql> create table test4 (id int,name varchar(5),age tinyint,primary key(id,name));
ログイン後にコピー
# です。 ##複合主キー特性と主キー いくつかの違いがありますが、反復しない必要があるのは 1 つのフィールドだけです。

mysql> insert into test4 values(1,'张三',21);
mysql> insert into test4 values(1,'李四',21);
mysql> insert into test4 values(1,'张三',21);	#主键列全重复
ERROR 1062 (23000): Duplicate entry '1-张三' for key 'PRIMARY'
ログイン後にコピー

テーブル データの表示

mysql> select * from test4;
+----+--------+------+
| id | name   | age  |
+----+--------+------+
|  1 | 张三   |   21 |
|  1 | 李四   |   21 |
+----+--------+------+
ログイン後にコピー
[関連する推奨事項:

mysql ビデオ チュートリアル

]

以上がmysqlインデックスとはどういう意味ですかの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
関連するチュートリアル
人気のおすすめ
最新のコース
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート