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)