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)