MySQL의 인덱스 개요 (개인 연구와 검토)

MySQL의 인덱스 개요


지수 소개

  • 정렬 필드의 복수의 세트를 기록하기위한 인덱싱 방법.

  • 책의 목차와 유사

  • 인덱스 유형에있어서 BTREE, B + 트리, 해시


인덱스의 장점과 단점

  •  인덱스 장점

    - 고유 인덱스를 생성하여, 데이터베이스에있는 데이터의 각 행의 고유성을 보장 할 수

    - 데이터 검색의 속도를 가속화 할 수 있습니다

  • 인덱스 단점

    - 테이블의 데이터가 삭제, 수정, 추가 할 경우, 지수는 동적 유지 될 유지 보수 속도 데이터를 줄여야합니다

    - 인덱스는 물리적 공간을 차지해야



MySQL의 키 유형


키 유형

  • INDEX : 일반 인덱스

  • UNIQUE : 유일한 인덱스

  • FULLTEXT : 전체 텍스트 색인

  • PRIMARY KEY : 기본 키

  • POREIGN KEY : 외래 키


일반 인덱스 INDEX

  • 명령

    - 테이블은 여러 필드 인덱스를 가질 수 있습니다

    - 반복 된 필드 값을 허용하고, NULL 값을 부여 할

    - 자주 INDEX를 필드에 쿼리 기준 필드을

    키 플래그 MUL -index 필드

  • 테이블 지정된 인덱스 필드의 건설

    -index (필드 1), 인덱스 (필드 2) ...

MySQL은> 테이블 TEST1을 (생성 
    -> 아이디 CHAR (6) null가 아닌, 
    -> 이름 varchar (4) null가 아닌, 
    -> 나이 INT (3) 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 | |
| 성 | ENUM ( '남성', '여성' ) | 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 | | 
| 성 | ENUM ( '남성', '여성') | 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 | | 
| 성 | ENUM ( '남성', '여성') | YES | | NULL | | 
+ -------- + ----------------------- + ------ + ----- + --- ------ + ------- + 
세트의 4 행 (0.00 초)
  • 보기 인덱스 정보 테이블

    表 名에서 -show 인덱스;

MySQL은> TEST1의 \의 G에서 인덱스를 보여; 
*************************** 1. 행 ******************** ******* 
        테이블 : TEST1 
   NON_UNIQUE 1 
     KEY_NAME : 아이디 
 Seq_in_index 1 
  COLUMN_NAME : 아이디 
    정렬하십시오 
  카디널리티 : 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 초)


기본 키 기본 키

  • 기본 개념

    - 테이블은 하나의 기본 키 필드를 가질 수 있습니다

    - 해당 중복 필드 값을 허용하고, 할당되지 않은 NULL 값은 허용되지 않습니다

    - 기본 키와 같은 여러 필드가있는 경우, 복합 기본 키는 함께 만들어야합니다라는

    - KEY는 기본 키 필드가 PRI입니다 표시

    - 일반적 AUTO_INCREMENT 함께 사용

    - 자주 테이블 레코드 필드는 고유의 레코드 번호 필드의 기본 키 [필드]를 식별 할 수

  • 기본 키 필드를 지정된 테이블의 건설

    차적인 키 (필드 이름)

MySQL의> 만들 테이블 TEST2 ( 
    -> 아이디 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 | | 
+ ------- + ------------ + ------ + ----- + --------- + ----- - + 
세트 (0.01 초)에서 3 행 
의 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 키 필드를 제거

    (당신은 필드 유형에 재 할당되고 제거하고 기본 키를 제거 auto_incrememt를 제거해야하는 경우 AUTO_INCREMENT) -alter 테이블 테이블 이름은 기본 키를 드롭

ysql> DESC TEST2; 
+ ------- + ------------ + ------ + ----- + --------- + ----- - + 
| 필드 | 입력 | 널 | 키 | 기본 | 추가 | 
+ ------- + ------------ + ------ + ----- + --------- + ----- - + 
| ID | INT (3) | NO | PRI | NULL | | 
| 이름 | VARCHAR (4) | NO | | NULL | | 
| 나이 | INT (2) | NO | | NULL | | 
+ ------- + ------------ + ------ + ----- + --------- + ----- - + 
세트 (0.00 초)에서 3 행 
의 MySQL> TEST2 테이블은 기본 키를 떨어 변경; 
쿼리 확인, 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의 작성> 표 yuangong ( 
    -> yg_id의 INT (4) AUTO_INCREMENT, 
    -> 이름 char (16) NOT NULL, 
    -> 기본 키 (yg_id) 
    ->); 
쿼리 확인, 0 행이 (0.31 초) 영향 
MySQL의> 테이블 gongzi를 (생성 
    -> gz_id의 INT (4) null가 아닌, 
    -> 이름 char (15) null가 아닌, 
    -> GZ 플로트 (6,2) NOT NULL 기본 0, 
    -> 인덱스 (이름) 
    -> 외래 키 (gz_id) 참조 yuangong (yg_id) 
    -> 삭제 캐스케이드에 업데이트 캐스케이드에 
    ->); 
쿼리 OK 영향 0 행 (0.32 초)
  • 외래 키 필드를 제거

    -alter 테이블 테이블은 외래 키 제약 조건의 이름을 드롭;

MySQL의> 쇼 테이블을 생성 gongzi \ G; 
*************************** 1. 행 ******************** ******* 
       테이블 : gongzi 
테이블 만들기 : 표`gongzi` (CREATE 
  , (4) NULL NOT`gz_id`의 INT를 
  `name` CHAR (15) NULL NOT, 
  `gz` 플로트 (6,2) NULL NOT DEFAULT '0.00' 
  KEY 'name` (`name`) 
  KEY`gz_id` (`gz_id`) 
  CONSTRAINT`gongzi_ibfk_1` FOREIGN KEY (`gz_id`) REFERENCES`yuangong` (yg_id`')의 ON DELETE CASCADE UPDATE ON CASCADE 
) ENGINE = 이노 DEFAULT 문자셋 = 라틴 
세트 (0.01 초)에 1 행 

의 MySQL> 외래 키 gongzi_ibfk_1 드롭 gongzi 테이블을 변경; 
쿼리 확인, 0 행이 영향 (0.01 초) 
기록 : 0 중복 : 0 경고 : 0
 
의 MySQL> 쇼 테이블을 작성 gongzi \ G;
*************************** 1. 행 ******************** ******* 
       테이블 : gongzi 
테이블 만들기 : 표`gongzi` (CREATE 
  , (4) NULL NOT`gz_id`의 INT를 
  `name` CHAR (15) NULL NOT, 
  `gz` 플로트 (6,2) NULL NOT DEFAULT '0.00' 
  KEY 'name` (`name`) 
  KEY`gz_id` (`gz_id`) 
) ENGINE = 이노 DEFAULT 문자셋 = 라틴 
세트의 1 행 (0.00 초)


UNIQUE 인덱스

  • 기본 개념

    - UNIQUE 고유성을 나타내고, 동일한 필드는 복수의 필드는 고유 갖는 가질 수도

  • 테이블을 만들 때 지정된 UNIQUE 인덱스 필드

    새로운 필드 구조 TEST3 테이블을 찾을 수 KEY 플래그 UNIQUE 필드를 UNI있다 참조; 또한, 필드 이름이 "NULL NOT"비어 있지 않은 제약 조건을 충족해야하기 때문에,이 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