수색…


통사론

  • - 간단한 색인 생성

    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;

복합 색인 작성

이렇게하면 mystringmydatetime 키의 복합 인덱스가 만들어지고 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_offsetauto_increment_increment 참조하십시오.
  • PRIMARY KEY 로 다른 것을 사용하고 INDEX(id) 좋습니다. (이것은 일부 상황에서의 최적화입니다.)
  • AUTO_INCREMENT 를 " PARTITION 키"로 사용하는 것은 거의 도움이되지 않습니다. 다른 것을해라.
  • 다양한 작업 값을 "태울"수 있습니다. INSERT IGNORE (dup 키 사용), REPLACE ( DELETE + INSERT ) 및 기타 등의 값을 미리 할당 한 다음 사용하지 마십시오. ROLLBACK 은 ID의 갭을 일으키는 또 다른 원인입니다.
  • 복제에서는 ID가 오름차순으로 슬레이브에 도착하는 것을 신뢰할 수 없습니다. id가 연속 한 순서로 할당 되어도, InnoDB 스테이트먼트는 COMMIT 순서로 슬레이브에 송신됩니다.


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow