MySQL에서 INDEX, PRIMARY, UNIQUE, FULLTEXT의 차이점은 무엇입니까?


610

MySQL 테이블을 생성 할 때 PRIMARY, UNIQUE, INDEX 및 FULLTEXT의 차이점은 무엇입니까?

어떻게 사용합니까?


3
궁금하신 분은 SPATIAL: stackoverflow.com/questions/2256364/…
Leo

파이썬에서 기본 인덱스와 보조 인덱스를 비교하려면이 게시물 stackoverflow.com/questions/59918440/secondary-index-in-python
Athanassios

답변:


674

차이점

  • KEY 또는 INDEX 는 고유 한 고유하지 않은 인덱스를 나타냅니다. 인덱스에 고유하지 않은 값이 허용되므로 인덱스의 모든 열에서 동일한 값을 가진 행 이 인덱스에 포함될 있습니다. 이 색인은 데이터에 대한 제한을 적용하지 않으므로 액세스에만 사용됩니다. 모든 레코드를 스캔하지 않고 특정 범위의 레코드에 빠르게 도달합니다.

  • UNIQUE 는 인덱스의 모든 행이 고유해야하는 인덱스를 나타냅니다. 즉, 동일한 행은이 인덱스의 모든 열에 대해 다른 행과 동일한 NULL이 아닌 값을 가질 수 없습니다. 데이터베이스 시스템은 데이터를 삽입하거나 업데이트 할 때 고유 값 규칙이 손상되지 않으므로 UNIQUE 인덱스를 사용하여 특정 레코드 범위에 빠르게 도달 할 수있을뿐만 아니라 데이터에 제한을 적용 할 수 있습니다.

    데이터베이스 시스템은 NULL 값을 허용하는 열에 UNIQUE 인덱스를 적용 할 수 있습니다.이 경우 두 행에 모두 NULL 값이 포함 된 경우 두 행이 동일하게 허용됩니다 (여기의 이론적 근거는 NULL이 자체와 동일하지 않은 것으로 간주 됨). 그러나 응용 프로그램에 따라 바람직하지 않을 수 있습니다.이를 방지하려면 관련 열에서 NULL 값을 허용하지 않아야합니다.

  • PRIMARY 는 이름이 항상 'PRIMARY'이고 테이블에 하나만있을 수 있다는 점을 제외하면 UNIQUE 인덱스와 똑같이 작동합니다 ( 일부 는 있어야하며 일부 데이터베이스 시스템에서는이를 강제하지 않음). PRIMARY 인덱스는 테이블에서 행을 고유하게 식별하는 기본 수단으로 사용되므로 UNIQUE와 달리 NULL 값을 허용하는 열에는 사용해서는 안됩니다. PRIMARY 색인은 행을 고유하게 식별하기에 충분한 가장 적은 수의 열에 있어야합니다. 종종 이것은 자동 증가 된 고유 번호를 포함하는 하나의 열이지만 국가 목록의 "국가 코드"와 같이 행을 고유하게 식별 할 수있는 다른 것이 있으면 대신 사용할 수 있습니다.

    일부 데이터베이스 시스템 (예 : MySQL의 InnoDB)은 테이블의 레코드를 PRIMARY 인덱스에 나타나는 순서대로 디스크에 저장합니다.

  • FULLTEXT 인덱스는 위의 모든 것과 다르며 데이터베이스 시스템마다 그 동작이 크게 다릅니다. FULLTEXT 색인은 MATCH () / AGAINST () 절을 사용하여 수행 한 전체 텍스트 검색에만 유용합니다. 위의 세 가지와는 달리 일반적으로 b- 트리를 사용하여 내부적으로 구현됩니다 (가장 왼쪽 열부터 시작하여 선택, 정렬 또는 범위를 허용 함). 해시 테이블 (가장 왼쪽 열부터 선택 가능).

    다른 인덱스 유형이 범용 인 경우 FULLTEXT 인덱스는 좁은 용도로 사용되므로 "전체 텍스트 검색"기능에만 사용됩니다.

유사점

  • 이러한 모든 인덱스에는 둘 이상의 열이있을 수 있습니다.

  • FULLTEXT를 제외하고는 열 순서가 중요합니다. 인덱스가 쿼리에 유용하려면 쿼리는 왼쪽부터 시작하여 인덱스의 열을 사용해야합니다. 두 번째, 세 번째 또는 네 번째 부분 만 사용할 수는 없습니다. 정적 값과 일치시키기 위해 인덱스의 이전 열을 사용하지 않는 한 인덱스. FULLTEXT 인덱스가 쿼리에 유용하려면 쿼리는 인덱스의 모든 열을 사용해야 합니다 .


2
이것은 쿼리에 MATCH () / AGAINST ()를 사용하지 않으면 FULLTEXT 인덱스가 본질적으로 쓸모없고 공간이 부족함을 의미합니까?
user1397417

5
예. 또한 InnoDB가 아닌 MySQL의 MyISAM 데이터베이스에만 사용됩니다. 다른 데이터베이스 서버에는 다르게 작동 할 수있는 동등한 기능이있을 수 있습니다.
thomasrutter

"널 (NULL) 값을 허용하는 열에는 사용하면 안됩니다"-> "사용할 수 없습니다". 기본 키는 반드시 있어야 NOT NULL합니다. MySQL은 show columns다른 기본 키가 정의되지 않은 경우 NULL이 아닌 고유 키가 기본 키임을 보고 합니다.
Gordon Linoff

1
여기에 이론적 근거는 NULL이 자신과 같지 않은 생각입니다 .. 롤 내가 잊지 못할이
호 수성

2
버전 5.6부터 InnoDB의 전체 텍스트를 지원하는 @thomasrutter MySQL
Marek Skiba

151

이 모든 것은 일종의 지표입니다.

primary : 고유해야하며 인덱스이고 물리 인덱스 일 가능성이 있으며 테이블 당 하나만있을 수 있습니다.

독창적 입니다. 이 값의 튜플을 가진 행을 두 개 이상 가질 수 없습니다. 고유 키가 둘 이상의 열에있을 수 있다는 것은 인덱스의 각 개별 열이 고유하다는 것을 의미하지는 않지만 이러한 열의 각 값 조합은 고유하다는 것을 의미합니다.

index : 기본 또는 고유하지 않은 경우 테이블에 삽입 된 값을 제한하지 않지만보다 효율적으로 조회 할 수 있습니다.

전체 텍스트 : 전체 텍스트 검색을 할 수 있도록 색인의보다 전문 형태. 지정된 열에서 각 "단어"에 대해 "인덱스"를 작성하는 것으로 생각하십시오.


32
기본 (primary)은 MySQL (및 기타 여러 DB)에서 복합 키, 즉 다중 키일 수 있습니다. 그들은 단지 특별한 색인 일뿐입니다. Unique는 실제로 인덱스가 아니라 제약 조건입니다 (적절한 시간에 인덱스를 실행해야 인덱스가 생성됨).
MBCook 2009

19

나는 이것이 다음을 제외하고 잘 다루어 진 것처럼 느낍니다.

  • 선택성이 충분하면 단순 KEY/ INDEX또는 달리 호출 SECONDARY INDEX하면 성능이 향상됩니다. 이 문제에 대한 일반적인 권장 사항은 인덱스가 적용되는 결과 집합의 레코드 수가 상위 테이블의 총 레코드 수의 20 %를 초과하면 인덱스가 유효하지 않다는 것입니다. 실제로 각 아키텍처는 다르지만 아이디어는 여전히 옳습니다.

  • 보조 인덱스 (그리고 mysql에 매우 특정한)는 기본 키와 완전히 분리되고 다른 객체로 간주되어서는 안됩니다. 사실, 둘 다 함께 사용해야하며, 일단이 정보가 알려지면 mysql DBA에 추가 도구를 제공해야합니다. Mysql에서 인덱스는 기본 키를 포함합니다. 특히 여기에 설명 된 것과 같은 암시 적 커버링 인덱스를 영리하게 구축 할 때 성능이 크게 향상됩니다.

  • 데이터가 있어야한다고 생각 UNIQUE되면 고유 색인을 사용하십시오. 선택 사항 (예 : 응용 프로그램 수준에서 작업하는 것)과 정상적인 색인이 가능하다고 생각할 수도 있지만 실제로는 각 행이 고유하다는 사실을 Mysql에 대한 보증으로 나타내며 결과적으로 성능상의 이점을 제공합니다.

  • 만 사용할 수 있습니다 FULLTEXT(또는 다른 불리는 SEARCH INDEX이노 디비 (MySQL은 5.6.4 이상)과의 MyISAM 엔진과)

  • 당신은 사용할 수 FULLTEXTCHAR, VARCHARTEXT열 유형
  • FULLTEXT인덱스는 단순히 인덱스를 만드는 것 이상의 많은 것을 포함합니다. 완전히 분리 된 캐싱 시스템과 일부 특정 규칙 및 최적화가 적용된 시스템 테이블이 많이 있습니다. 참조 http://dev.mysql.com/doc/refman/5.7/en/fulltext-restrictions.htmlhttp://dev.mysql.com/doc/refman/5.7/en/innodb-fulltext-index.html
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.