MySQLのインデックスの概要(個人研究とレビューのために)

MySQLのインデックスの概要


インデックスはじめに

  • ソートするフィールドの複数のセットを記録するためのインデクシング方法。

  • 内容の本のテーブルと同様に

  • インデックスのタイプであって、Bツリー、B +木、ハッシュ


インデックスの長所と短所

  •  インデックスの利点

    - ユニークなインデックスを作成することによって、あなたは、データベース内のデータの各行の一意性を保証することができます

    - データ検索の速度を加速することができ

  • インデックスのデメリット

    - テーブル内のデータは削除し、修正、追加する場合は、インデックスは、動的なメンテナンスもメンテナンス速度データを減らす必要があります

    - インデックスは、物理的なスペースを占有する必要があります



MySQLのキータイプ


キーの種類

  • INDEX:一般的な指標

  • UNIQUE:インデックスのみ

  • FULLTEXT:フルテキストインデックス

  • PRIMARY KEY:主キー

  • POREIGN KEY:外部キー


一般的なインデックスINDEX

  • 説明書

    - テーブルには、複数のフィールドINDEXを持つことができます

    - 繰り返しフィールドの値を可能にし、NULL値を付与することができます

    - 多くの場合、INDEXをフィールドするクエリ条件フィールドを行います

    キーフラグMUL -INDEXフィールド

  • テーブルの指定されたインデックスフィールドの構築

    -index(フィールド1)、インデックス(フィールド2)...

mysqlの>テーブルtest1の(作成
    >のid CHAR(6)nullではない、 - 
    - >名前のVARCHAR(4)NOT NULL、
    - >年齢はint(3)NOT NULL、
    - >男女のenum( '男性'、 '女性')、
    - >インデックス(ID)、インデックス(名前)
    - >)。
影響を受けたクエリOK、0行(0.06秒)
のMySQL> DESC TEST1。
+ -------- + ----------------------- + ------ + ----- + --- ------ + ------- + 
| フィールド| タイプ| ヌル| キー| デフォルト| エクストラ| 
+ -------- + ----------------------- + ------ + ----- + --- ------ + ------- + 
| ID | CHAR(6)| NO | MUL | NULL | | 
| 名前| VARCHAR(4)| NO | MUL | NULL | | 
| 年齢| INT(3)| NO | | NULL | |
| 性別| 列挙型( '男性'、 '女性')| YES | | NULL | | 
+ -------- + ----------------------- + ------ + ----- + --- ------ + ------- + 
組の4行(0.00秒)
  • 既存のテーブルにインデックスフィールドを設定します。

    テーブル名(フィールド名)に-createインデックスインデックス名。

MySQLの> TEST1(年齢)にインデックス年齢を作成します。
影響を受けたクエリOK、0行(0.02秒)
記録:0重複:0警告:0 
のMySQL> DESC TEST1。
+ -------- + ----------------------- + ------ + ----- + --- ------ + ------- + 
| フィールド| タイプ| ヌル| キー| デフォルト| エクストラ| 
+ -------- + ----------------------- + ------ + ----- + --- ------ + ------- + 
| ID | CHAR(6)| NO | MUL | NULL | | 
| 名前| VARCHAR(4)| NO | | NULL | | 
| 年齢| INT(3)| NO | MUL | NULL | | 
| 性別| 列挙型( '男性'、 '女性')| YES | | NULL | | 
+ -------- + ----------------------- + ------ + ----- + --- ------ + ------- + 
組の4行(0.00秒)
  • 指定したテーブルのインデックスフィールドを削除します。

    テーブル上のインデックスインデックス名-drop。

MySQLの> TEST1にインデックス名をドロップします。
影響を受けたクエリOK、0行(0.34秒)
記録:0重複:0警告:0 
のMySQL> DESC TEST1。
+ -------- + ----------------------- + ------ + ----- + --- ------ + ------- + 
| フィールド| タイプ| ヌル| キー| デフォルト| エクストラ| 
+ -------- + ----------------------- + ------ + ----- + --- ------ + ------- + 
| ID | CHAR(6)| NO | MUL | NULL | | 
| 名前| VARCHAR(4)| NO | | NULL | | 
| 年齢| INT(3)| NO | | NULL | | 
| 性別| 列挙型( '男性'、 '女性')| YES | | NULL | | 
+ -------- + ----------------------- + ------ + ----- + --- ------ + ------- + 
組の4行(0.00秒)
  • ビューのインデックス情報テーブル

    表名から-showインデックス。

TEST1の\ GからMySQLの>ショーのインデックス。
*************************** 1行******************** ******* 
        表:TEST1 
   NON_UNIQUE:1 
     KEY_NAME:IDの
 Seq_in_index:1 
  Column_nameの:IDの
    照合:
  カーディナリティ:0 
     Sub_part:NULL 
       パック:NULL 
         ヌル:  
   INDEX_TYPE:BTREEの
      コメント:  
Index_comment:  
******* ******************** 2行*************************** 
        表:TEST1 
   NON_UNIQUE:1 
     KEY_NAME:年齢
 Seq_in_index:1 
  Column_nameの:年齢
    照合:
  カーディナリティ:0  
     Sub_part:NULL
       ランチ:NULL
         ヌル:  
   INDEX_TYPE:BTREEの
      コメント:  
Index_comment:  
セット内の2行(0.00秒)


主キー主キー

  • 基本コンセプト

    - テーブルには、1つのプライマリキーフィールドを持つことができます

    - 対応する重複するフィールドの値は許されず、割り当てられたNULL値は許可されません

    - 主キーとして複数のフィールドがある場合は、複合主キーを一緒に作成する必要がありますと呼ばれます

    - KEYは、主キーフィールドがPRIであるマーク

    - 通常はAUTO_INCREMENTと組み合わせて使用

    - 多くの場合、テーブルのレコードのフィールドは、一意のレコード番号フィールド[フィールド]の主キーを識別することができます

  • 主キーフィールドを指定したテーブルの構築

    -primaryキー(フィールド名)

MySQLの> CREATE TABLEのTEST2(
    - >のID INT(3)AUTO_INCREMENT、
    - >名VARCHAR(4)NOT NULL、
    - >年齢INT(2)nullでない、
    - >主キー(ID)
    - >)。
影響を受けたクエリOK、0行(0.05秒)
のMySQL> DESC TEST2。
+ ------- + ------------ + ------ + ----- + --------- + ----- ----------- + 
| フィールド| タイプ| ヌル| キー| デフォルト| エクストラ| 
+ ------- + ------------ + ------ + ----- + --------- + ----- ----------- + 
| ID | INT(3)| NO | PRI | NULL | AUTO_INCREMENT | 
| 名前| VARCHAR(4)| NO | | NULL | | 
| 年齢| INT(2)| NO | | NULL | | 
+ ------- + ------------ + ------ + ----- + --------- + ----- ----------- +
セット内の3行(0.00秒
  • 既存のテーブルの主キーフィールドを設定します。

    -ALTERテーブル表には主キー(フィールド名)を追加します。

MySQLの> DESC TEST2。
+ ------- + ------------ + ------ + ----- + --------- + ----- - + 
| フィールド| タイプ| ヌル| キー| デフォルト| エクストラ| 
+ ------- + ------------ + ------ + ----- + --------- + ----- - + 
| ID | INT(3)| NO | | NULL | | 
| 名前| VARCHAR(4)| NO | | NULL | | 
| 年齢| INT(2)| NO | | NULL | | 
+ ------- + ------------ + ------ + ----- + --------- + ----- - + 
セット内の3行(0.01秒)
のMySQL>テーブルTEST2を変更する主キー(名称)を追加します。
影響を受けたクエリOK、0行(0.05秒)
レコード:0重複:0警告:0
+ ------- + ------------ + ------ + ----- + --------- + ----- - + 
mysqlの> DESC TEST2。
+ ------- + ------------ + ------ + ----- + --------- + ----- - +
| フィールド| タイプ| ヌル| キー| デフォルト| エクストラ| 
| ID | INT(3)| NO | | NULL | | 
| 名前| VARCHAR(4)| NO | PRI | NULL | | 
| 年齢| INT(2)| NO | | NULL | | 
+ ------- + ------------ + ------ + ----- + --------- + ----- - + 
セット内の3行(0.00秒)
  • テーブルPRIMARY KEYフィールドを削除します

    (あなたはフィールドタイプに再割り当てされて削除してから、主キーを削除し、auto_incrememtを削除する必要がある場合は、AUTO_INCREMENT); -ALTERテーブルのテーブル名は、主キーをドロップ

YSQL> DESC TEST2。
+ ------- + ------------ + ------ + ----- + --------- + ----- - + 
| フィールド| タイプ| ヌル| キー| デフォルト| エクストラ| 
+ ------- + ------------ + ------ + ----- + --------- + ----- - + 
| ID | INT(3)| NO | PRI | NULL | | 
| 名前| VARCHAR(4)| NO | | NULL | | 
| 年齢| INT(2)| NO | | NULL | | 
+ ------- + ------------ + ------ + ----- + --------- + ----- - + 
セット内の3行(0.00秒)
のMySQL>テーブルTEST2が主キーをドロップ変えます。
影響を受けたクエリOK、0行(0.31秒)
レコード:0重複:0警告:0 
mysqlの> DESC TEST2。
+ ------- + ------------ + ------ + ----- + --------- + ----- - + 
| フィールド| タイプ| ヌル| キー| デフォルト| エクストラ| 
+ ------- + ------------ + ------ + ----- + --------- + ----- - +
| ID | INT(3)| NO | | NULL | | 
| 名前| VARCHAR(4)| NO | | NULL | | 
| 年齢| INT(2)| NO | | NULL | | 
+ ------- + ------------ + ------ + ----- + --------- + ----- - + 
セット内の3行(0.01秒)


外部キー外部キー

  • 基本コンセプト

    - テーブルの範囲内に値する選択肢で別のフィールドに現在のテーブルのフィールドの値をしましょう。

  • 外部キーの条件を用いて

    - 表のストレージエンジンはInnoDBのでなければなりません

    - フィールドの型が一致しているために

    - インデックス・フィールドは、タイプ(プライマリキー)を参照する必要がある場合

  • 基本的な使い方

MySQLの> CREATE TABLEのyuangong(
    - > yg_id整数(4)AUTO_INCREMENT、
    - >名char(16)NOT NULL、
    - >主キー(yg_id)
    - >)。
クエリOK、0行は(0.31秒)の影響を受け
mysqlの>テーブルgongziを(作成
    - > gz_id int型(4)nullではない、
    - > [名char(15)nullではない、
    - > GZフロート(6,2)NOT NULLデフォルト0、
    - >インデックス(名前)、
    - >外部キー(gz_id)参照yuangong(yg_id)
    - > ON DELETE CASCADEを更新カスケード上
    - >)。
影響を受けたクエリOK、0行(0.32秒)
  • 外部キーフィールドを削除します

    -ALTERテーブルテーブルは、外部キー制約名をドロップします。

MySQLの>ショーは、テーブルgongzi \ Gを作成します。
*************************** 1行******************** ******* 
       表:gongzi 
表の作成:表`gongzi`(CREATE 
  ` gz_id` INTは(4)NOT NULL、
  `NAME` CHAR(15)NOT NULL、
  ` gz`フロート(6,2)NOT NULLをDEFAULT '0.00'、
  KEY `NAME`(` NAME`)、
  KEY `gz_id`(` gz_id`)、
  UPDATE ON DELETE CASCADEの制約`gongzi_ibfk_1` FOREIGN KEY(` gz_id`)REFERENCES `yuangong`(` yg_id`) CASCADE 
)ENGINE = InnoDBのデフォルトの文字セット= LATIN1 
セット(0.01秒)に1行

のMySQL>外部キーgongzi_ibfk_1ドロップgongziテーブルを変更します。
クエリOK、0行が影響を受けた(0.01秒)
レコード:0重複:0警告:0
 
のMySQL>番組表を作成gongzi \ G。
*************************** 1行******************** ******* 
       表:gongzi 
表の作成:表`gongzi`(CREATE 
  ` gz_id` INTは(4)NOT NULL、
  `NAME` CHAR(15)NOT NULL、
  ` gz`フロート(6,2)NOT NULLをDEFAULT '0.00'、
  KEY `NAME`(` NAME`)、
  KEY `gz_id`(` gz_id`)
)ENGINE = InnoDBのデフォルトの文字セット= LATIN1 
セット内の1行(0.00秒)


UNIQUEインデックス

  • 基本コンセプト

    - ユニークな独自性を表し、同じフィールドがユニークを有する複数のフィールドを有していてもよいです

  • 表の作成時に指定したUNIQUEインデックスフィールド

    新しいフィールド構造TEST3テーブルがKEYフラグUNIQUEフィールドがUNIで見つけることができます参照してください。さらに、フィールド名は「NOT NULL」非空の制約を満たす必要がありますから、それは自動的にUNIQUEに設定された後は、PRIMARY KEY主キーフィールドとなり:

mysql> create table test3(
    -> id char(6),
    -> name varchar(4) not null,
    -> age int(3) not null,
    -> unique(id),unique(name),index(age)
    -> );
Query OK, 0 rows affected (0.36 sec)
mysql> desc  test3;
+-------+------------+------+-----+---------+-------+
| Field | Type       | Null | Key | Default | Extra |
+-------+------------+------+-----+---------+-------+
| id    | char(6)    | YES  | UNI | NULL    |       |
| name  | varchar(4) | NO   | PRI | NULL    |       |
| age   | int(3)     | NO   | MUL | NULL    |       |
+-------+------------+------+-----+---------+-------+
3 rows in set (0.00 sec)
  • 删除UNIQUE索引,在已有的表中设置UNIQUE索引字段

mysql> drop index name on test3;
Query OK, 0 rows affected (0.07 sec)
Records: 0  Duplicates: 0  Warnings: 0
mysql> desc test3;
+-------+------------+------+-----+---------+-------+
| Field | Type       | Null | Key | Default | Extra |
+-------+------------+------+-----+---------+-------+
| id    | char(6)    | YES  | UNI | NULL    |       |
| name  | varchar(4) | NO   |     | NULL    |       |
| age   | int(3)     | NO   | MUL | NULL    |       |
+-------+------------+------+-----+---------+-------+
3 rows in set (0.00 sec)
  • 在已有表中建立UNIQUE索引

mysql> create unique index name on test3(name);
Query OK, 0 rows affected (0.06 sec)
Records: 0  Duplicates: 0  Warnings: 0
mysql> desc test3;
+-------+------------+------+-----+---------+-------+
| Field | Type       | Null | Key | Default | Extra |
+-------+------------+------+-----+---------+-------+
| id    | char(6)    | YES  | UNI | NULL    |       |
| name  | varchar(4) | NO   | PRI | NULL    |       |
| age   | int(3)     | NO   | MUL | NULL    |       |
+-------+------------+------+-----+---------+-------+
3 rows in set (0.00 sec)












おすすめ

転載: blog.51cto.com/11483827/2413721