mysql 인덱스의 개념과 조작

일반적으로 사용되는 색인은 다음과 같습니다.
key:일반 인덱스
unique key:고유 인덱스
primary key:기본 키 인덱스
full text:전체 텍스트 인덱스
테이블 t8 만들기 일반 인덱스 키와 유일한 인덱스 unique 키 추가하기
mysql> create table t8 ( id int, name char(10), email char(20),key name(name),unique key(email) );
Query OK, 0 rows affected (0.01 sec)

테이블 구조를 보려면 다음과 같이 하십시오.
mysql> desc t8;
+-------+----------+------+-----+---------+-------+
| Field | Type     | Null | Key | Default | Extra |
+-------+----------+------+-----+---------+-------+
| id    | int(11)  | YES  |     | NULL    |       |
| name  | char(10) | YES  | MUL | NULL    |       |
| email | char(20) | YES  | UNI | NULL    |       |
+-------+----------+------+-----+---------+-------+
3 rows in set (0.00 sec)

데이터를 삽입하려면 다음과 같이 하십시오.
mysql> insert into t8 values ("1","lisi","[email protected]")
    -> ;
Query OK, 1 row affected (0.01 sec)

쿼리 데이터:
mysql> select * from t8;
+------+------+----------------+
| id   | name | email          |
+------+------+----------------+
|    1 | lisi | [email protected] |
+------+------+----------------+
1 row in set (0.00 sec)

#unique key 유일성,[email protected]메일박스가 이미 존재합니다. 같은 것을 허용하지 않습니다.
mysql> insert into t8 values ("2","lisi","[email protected]")
    -> ;
ERROR 1062 (23000): Duplicate entry '[email protected]' for key 'email'

테이블 t9 만들기, 키 키:
mysql> create table t9 ( id int, name char(10), email char(20),primary key (id),key id (name),unique key(email) );
Query OK, 0 rows affected (0.04 sec)
mysql> desc t9;
+-------+----------+------+-----+---------+-------+
| Field | Type     | Null | Key | Default | Extra |
+-------+----------+------+-----+---------+-------+
| id    | int(11)  | NO   | PRI | 0       |       |
| name  | char(10) | YES  | MUL | NULL    |       |
| email | char(20) | YES  | UNI | NULL    |       |
+-------+----------+------+-----+---------+-------+
3 rows in set (0.00 sec)

## 인덱스 길이: 인덱스를 작성할 때 열 앞부분만 인덱스할 수 있습니다. 예를 들어 처음 10자입니다.
키 id와 같이 (email(10)
# 인덱스 이메일 길이는 10자입니다. 테이블의 이메일 열에 10자만 삽입할 수 있는 것이 아니라 인덱스 인용 시 emial 열 앞의 10자만 인용할 수 있습니다.
mysql> create table t10 ( id int, name char(10), email char(20),primary key (id),key id (email(10)),unique key(email) );
Query OK, 0 rows affected (0.02 sec)
mysql> desc t10;
+-------+----------+------+-----+---------+-------+
| Field | Type     | Null | Key | Default | Extra |
+-------+----------+------+-----+---------+-------+
| id    | int(11)  | NO   | PRI | 0       |       |
| name  | char(10) | YES  |     | NULL    |       |
| email | char(20) | YES  | UNI | NULL    |       |
+-------+----------+------+-----+---------+-------+
3 rows in set (0.00 sec)

# 10자 이상의 이메일을 삽입해도 됩니다.
mysql> insert into t10 values (1,"lisi","[email protected]");
Query OK, 1 row affected (0.01 sec)

다열 인덱스: 2개 혹은 다열의 값을 하나의 전체로 보고 인덱스를 만듭니다.
mysql> create table t11 (
    -> xing char(2),
    -> ming char(10),
    -> key xm(xing,ming)
    -> );
Query OK, 0 rows affected (0.02 sec)
mysql> desc t11;
+-------+----------+------+-----+---------+-------+
| Field | Type     | Null | Key | Default | Extra |
+-------+----------+------+-----+---------+-------+
| xing  | char(2)  | YES  | MUL | NULL    |       |
| ming  | char(10) | YES  |     | NULL    |       |
+-------+----------+------+-----+---------+-------+
2 rows in set (0.00 sec)
mysql> insert into  t11 values (" ","  ");
Query OK, 1 row affected (0.00 sec)
mysql> select * from t11;
+------+--------+
| xing | ming   |
+------+--------+
|     |      |
+------+--------+
1 row in set (0.00 sec)

테이블 t11의 색인을 보려면 다음과 같이 하십시오.
mysql> show index from t11 \G;
*************************** 1. row ***************************
        Table: t11
   Non_unique: 1
     Key_name: xm
 Seq_in_index: 1
  Column_name: xing
    Collation: A
  Cardinality: 1
     Sub_part: NULL
       Packed: NULL
         Null: YES
   Index_type: BTREE
      Comment: 
Index_comment: 
*************************** 2. row ***************************
        Table: t11
   Non_unique: 1
     Key_name: xm
 Seq_in_index: 2
  Column_name: ming
    Collation: A
  Cardinality: 1
     Sub_part: NULL
       Packed: NULL
         Null: YES
   Index_type: BTREE
      Comment: 
Index_comment: 
2 rows in set (0.00 sec)
ERROR: 
No query specified

# 다중 열 색인에 대한 질의입니다.
mysql> select * from t11 where xing=" " and ming="  ";
+------+--------+
| xing | ming   |
+------+--------+
|     |      |
+------+--------+
1 row in set (0.01 sec)

질의에 사용할 색인 보기:explain
possible_keys: 사용할 수 있는 키
키:찾은 키.
mysql> explain select * from t11 where xing=" " and ming="  ";
+----+-------------+-------+------+---------------+------+---------+-------------+------+--------------------------+
| id | select_type | table | type | possible_keys | key  | key_len | ref         | rows | Extra                    |
+----+-------------+-------+------+---------------+------+---------+-------------+------+--------------------------+
|  1 | SIMPLE      | t11   | ref  | xm            | xm   | 38      | const,const |    1 | Using where; Using index |
+----+-------------+-------+------+---------------+------+---------+-------------+------+--------------------------+
1 row in set (0.00 sec)
mysql> explain select * from t11 where xing=" ";
+----+-------------+-------+------+---------------+------+---------+-------+------+--------------------------+
| id | select_type | table | type | possible_keys | key  | key_len | ref   | rows | Extra                    |
+----+-------------+-------+------+---------------+------+---------+-------+------+--------------------------+
|  1 | SIMPLE      | t11   | ref  | xm            | xm   | 7       | const |    1 | Using where; Using index |
+----+-------------+-------+------+---------------+------+---------+-------+------+--------------------------+
1 row in set (0.00 sec)
mysql> explain select * from t11 where  ming="  ";
+----+-------------+-------+-------+---------------+------+---------+------+------+--------------------------+
| id | select_type | table | type  | possible_keys | key  | key_len | ref  | rows | Extra                    |
+----+-------------+-------+-------+---------------+------+---------+------+------+--------------------------+
|  1 | SIMPLE      | t11   | index | NULL          | xm   | 38      | NULL |    1 | Using where; Using index |
+----+-------------+-------+-------+---------------+------+---------+------+------+--------------------------+
1 row in set (0.00 sec)
mysql> explain select * from t11 where  ming="  " and xing=" ";
+----+-------------+-------+------+---------------+------+---------+-------------+------+--------------------------+
| id | select_type | table | type | possible_keys | key  | key_len | ref         | rows | Extra                    |
+----+-------------+-------+------+---------------+------+---------+-------------+------+--------------------------+
|  1 | SIMPLE      | t11   | ref  | xm            | xm   | 38      | const,const |    1 | Using where; Using index |
+----+-------------+-------+------+---------------+------+---------+-------------+------+--------------------------+
1 row in set (0.00 sec)

불필요한 인덱스: 어떤 열에 여러 개의 인덱스가 존재할 수 있습니다.예를 들어 xm(xing,ming)m(ming).목적은 조회 속도를 높이는 데 있다.
mysql> create table t12 ( xing char(2), ming char(10), key xm(xing,ming),key m(ming) );
Query OK, 0 rows affected (0.02 sec)

테이블 t12에서 사용한 색인을 보려면 다음과 같이 하십시오.
mysql> show index from t12;
+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| t12   |          1 | xm       |            1 | xing        | A         |           0 |     NULL | NULL   | YES  | BTREE      |         |               |
| t12   |          1 | xm       |            2 | ming        | A         |           0 |     NULL | NULL   | YES  | BTREE      |         |               |
| t12   |          1 | m        |            1 | ming        | A         |           0 |     NULL | NULL   | YES  | BTREE      |         |               |
+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
3 rows in set (0.00 sec)
mysql> show index from t12 \G;
*************************** 1. row ***************************
        Table: t12
   Non_unique: 1
     Key_name: xm
 Seq_in_index: 1
  Column_name: xing
    Collation: A
  Cardinality: 0
     Sub_part: NULL
       Packed: NULL
         Null: YES
   Index_type: BTREE
      Comment: 
Index_comment: 
*************************** 2. row ***************************
        Table: t12
   Non_unique: 1
     Key_name: xm
 Seq_in_index: 2
  Column_name: ming
    Collation: A
  Cardinality: 0
     Sub_part: NULL
       Packed: NULL
         Null: YES
   Index_type: BTREE
      Comment: 
Index_comment: 
*************************** 3. row ***************************
        Table: t12
   Non_unique: 1
     Key_name: m
 Seq_in_index: 1
  Column_name: ming
    Collation: A
  Cardinality: 0
     Sub_part: NULL
       Packed: NULL
         Null: YES
   Index_type: BTREE
      Comment: 
Index_comment: 
3 rows in set (0.00 sec)
ERROR: 
No query specified

#색인을 삭제합니다.
구문:
alter table 테이블 이름drop index 인덱스 이름
drop index 인덱스 이름 on 테이블 이름
mysql> alter table t12 drop index m;
Query OK, 0 rows affected (0.02 sec)
Records: 0  Duplicates: 0  Warnings: 0
mysql> drop index xm on t12;
Query OK, 0 rows affected (0.01 sec)
Records: 0  Duplicates: 0  Warnings: 0
mysql> show index from t12 \G;
Empty set (0.00 sec)
ERROR: 
No query specified

색인 추가
alter table    add [index/unique]    ;
mysql> alter table t12 add index xm(xing,ming);
Query OK, 0 rows affected (0.02 sec)
Records: 0  Duplicates: 0  Warnings: 0
mysql> alter table t12 add unique m(ming);
Query OK, 0 rows affected (0.01 sec)
Records: 0  Duplicates: 0  Warnings: 0
mysql> show create table t12;
+-------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table                                                                                                                                                                   |
+-------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| t12   | CREATE TABLE `t12` (
  `xing` char(2) DEFAULT NULL,
  `ming` char(10) DEFAULT NULL,
  UNIQUE KEY `m` (`ming`),
  KEY `xm` (`xing`,`ming`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
+-------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

키 인덱스 추가
mysql> alter table t12 add primary key(xing);
Query OK, 0 rows affected (0.02 sec)
Records: 0  Duplicates: 0  Warnings: 0

키 인덱스 삭제
mysql> alter table t12 drop primary key;
Query OK, 0 rows affected (0.02 sec)
Records: 0  Duplicates: 0  Warnings: 0

좋은 웹페이지 즐겨찾기