MySQL
색인 및 키
수색…
통사론
- 간단한 색인 생성
CREATE INDEX index_name ON table_name ( column_name1 [, column_name2 , ...])
- 고유 색인 생성
TABLE_NAME에서 고유 색인 INDEX_NAME 생성 (COLUMN_NAME1 [COLUMN_NAME2 ...]
- 색인 삭제
DROP INDEX index_name ON tbl_name [ 알고리즘 _ 옵션 | lock_option ] ...
algorithm_option : 알고리즘 [=] {DEFAULT | INPLACE | COPY}
lock_option : LOCK [=] {DEFAULT | NONE | SHARED | EXCLUSIVE}
비고
개념
MySQL 테이블의 색인은 책의 색인처럼 작동합니다.
예를 들어, 데이터베이스에 관한 책이 있고 스토리지에 대한 정보를 찾고 싶다고 가정 해 봅시다. 목차와 같은 다른 도움이 없다는 가정하에 인덱스가 없으면 항목을 찾을 때까지 페이지를 하나씩 거쳐야합니다 ( "전체 테이블 스캔"). 반면에 색인에는 키워드 목록이 있으므로 색인을 참조하면 저장 용량이 113-120, 231 및 354 페이지에 나와 있습니다. 그런 다음 검색하지 않고 해당 페이지로 바로 넘길 수 있습니다 (즉, 인덱스가있는 검색, 다소 빠름).
물론 인덱스의 유용성은 위의 직유를 사용하는 몇 가지 예에 따라 달라집니다.
- 데이터베이스에 관한 책이 있고 "데이터베이스"라는 단어를 색인 한 경우 1-59, 61-290 및 292-400 페이지에 언급되어있는 것을 볼 수 있습니다. 그것은 많은 페이지이고, 그러한 경우에, 색인은별로 도움이되지 않으며 하나씩 페이지를 통과하는 것이 더 빠를 수도 있습니다. (데이터베이스에서 이것은 "선택도 부족"입니다.)
- 10 페이지짜리 책의 경우 색인을 만드는 것이 의미가 없습니다. 10 페이지 분량의 책이 5 페이지 색인으로 시작될 수 있습니다. 단지 5 페이지짜리 색인이 붙어 있습니다. 단지 10 페이지 만 스캔하고 끝내면됩니다. .
- 색인은 또한 유용 할 필요가있다 - 일반적으로 색인을 붙일 아무 점도, 예를 들면, 페이지 당 문자 "L"의 주파수.
색인 만들기
-- Create an index for column 'name' in table 'my_table'
CREATE INDEX idx_name ON my_table(name);
고유 색인 작성
고유 인덱스는 중복 된 데이터를 테이블에 삽입하지 못하게합니다. NULL
값 (정의함으로써, 이후의 고유 인덱스 부분 형성 열에 삽입 될 수 NULL
값은 다른 포함한 다른 값 상이한 NULL
값)
-- Creates a unique index for column 'name' in table 'my_table'
CREATE UNIQUE INDEX idx_name ON my_table(name);
낙하 지수
-- Drop an index for column 'name' in table 'my_table'
DROP INDEX idx_name ON my_table;
복합 색인 작성
이렇게하면 mystring
과 mydatetime
키의 복합 인덱스가 만들어지고 WHERE
절의 두 열이 모두 포함 된 쿼리가 빨라집니다.
CREATE INDEX idx_mycol_myothercol ON my_table(mycol, myothercol)
참고 : 순서가 중요합니다! 검색 쿼리에 WHERE
절에 두 열이 모두 포함되어 있지 않으면 가장 왼쪽의 인덱스 만 사용할 수 있습니다. 이 경우에 쿼리 mycol
에서 WHERE
쿼리가 검색 인덱스, 사용 myothercol
또한 검색없이 mycol
하지 않습니다. 자세한 내용은 이 블로그 게시물을 확인하십시오 .
참고 : BTREE의 작동 방식 때문에 일반적으로 범위에서 쿼리되는 열은 가장 오른쪽에 있어야합니다. 예를 들어, DATETIME
열은 WHERE datecol > '2016-01-01 00:00:00'
처럼 WHERE datecol > '2016-01-01 00:00:00'
질의됩니다. BTREE 인덱스는 범위를 매우 효율적으로 처리하지만 범위로 쿼리되는 열이 복합 인덱스의 마지막 인덱스 인 경우에만 유용합니다.
AUTO_INCREMENT 키
CREATE TABLE (
id INT UNSIGNED NOT NULL AUTO_INCREMENT,
...
PRIMARY KEY(id),
... );
주요 메모 :
- 1로 시작하고
INSERT
에 지정하지 않을 경우 자동으로 1 씩 증가 시키거나NULL
로 지정합니다. - ID는 항상 서로 구별되지만 ...
- 특정 순간에 유일하지 않은 ID의 값에 대해 어떠한 가정 (연속적으로 생성되지 않거나 재사용되지 않음)을하지 마십시오.
미묘한 메모 :
- 서버를 다시 시작할 때 '다음'값은
MAX(id)+1
로 '계산 됨'입니다. - 종료 또는 충돌 이전의 마지막 작업이 가장 높은 ID를 삭제하는 것이면 해당 ID 가 재사용 될 수 있습니다 (엔진에 따라 다름). 따라서 auto_increments가 영구적으로 고유하다고 믿지 마십시오 . 그들은 언제나 유일하다.
- 다중 마스터 또는 클러스터 된 솔루션의 경우
auto_increment_offset
및auto_increment_increment
참조하십시오. -
PRIMARY KEY
로 다른 것을 사용하고INDEX(id)
좋습니다. (이것은 일부 상황에서의 최적화입니다.) -
AUTO_INCREMENT
를 "PARTITION
키"로 사용하는 것은 거의 도움이되지 않습니다. 다른 것을해라. - 다양한 작업 은 값을 "태울"수 있습니다.
INSERT IGNORE
(dup 키 사용),REPLACE
(DELETE
+INSERT
) 및 기타 등의 값을 미리 할당 한 다음 사용하지 마십시오.ROLLBACK
은 ID의 갭을 일으키는 또 다른 원인입니다. - 복제에서는 ID가 오름차순으로 슬레이브에 도착하는 것을 신뢰할 수 없습니다. id가 연속 한 순서로 할당 되어도, InnoDB 스테이트먼트는
COMMIT
순서로 슬레이브에 송신됩니다.