기본 키는 MySQL에서 자동으로 인덱싱됩니까?


243

명시 적으로 인덱스를 작성해야합니까, 기본 키를 정의 할 때 암시 적입니까? 답변은 MyISAM과 InnoDB에 대해 동일합니까?

답변:


294

기본 키는 항상 색인화됩니다. 이는 MyISAM 및 InnoDB와 동일하며 일반적으로 인덱스를 지원하는 모든 스토리지 엔진에 적용됩니다.


5
기본 키가 항상 색인화되어있는 경우 데이터베이스 아키텍처 / 성능에 대해 이야기 할 때 사람들이 항상 SQL 신규 사용자에게 "데이터베이스가 올바르게 색인화되도록"조언하는 이유는 무엇입니까?
팀 피터슨

35
@tim : 그들은 사람들에게 필터링, 그룹화 또는 정렬에 사용되는 다른 모든 열에도 인덱스가 있는지 확인하도록 지시합니다.
Emil H

15
조인도 잊지 마십시오! 인덱스 조인 필드는 작업 속도를 높입니다.
JustJohn

31

http://dev.mysql.com/doc/refman/5.0/en/constraint-primary-key.html 에 따르면 이것이 암시 적 인 것처럼 보입니다.


1
질문하기 전에 검색하여 해당 링크를 찾았습니다. 그러나 그것은이 질문에 대해 나에게 많은 것을 암시하지 않는 것 같습니다.
Alex Miller

이 답변에 링크 된 페이지는 기본 키가 인덱스인지 여부에 대해 아무 말도하지 않는 것 같습니다. @fyrye 의 답변에 링크 된 페이지 가 더 관련성이 있습니다.
George Hawkins

16

2009 년에 이것이 요청되었지만 기본 키에 대한 MySQL 설명서에 대한 실제 참조를 게시 할 것이라고 생각했습니다. http://dev.mysql.com/doc/refman/5.5/en/optimizing-primary-keys.html

테이블 의 기본 키 는 가장 중요한 쿼리에 사용하는 열 또는 열 집합을 나타냅니다. 빠른 쿼리 성능을 위해 관련 인덱스가 있습니다.

MySQL 5.0 참조는 http://dev.mysql.com/doc/refman/5.0/en/mysql-indexes.html을 참조하십시오.

대부분의 MySQL 인덱스 ( PRIMARY KEY , UNIQUE, INDEX 및 FULLTEXT)는 B- 트리에 저장됩니다. 공간 데이터 유형의 인덱스가 R- 트리를 사용하고 MEMORY 테이블도 해시 인덱스를 지원한다는 점은 예외입니다.


11

기본 키는 MyISAM 및 InnoDB 모두에 대해 암시 적으로 색인됩니다. 기본 키를 사용하는 쿼리에서 EXPLAIN을 사용하여이를 확인할 수 있습니다.



8

나는 이것이 답이라고 생각한다

mysql> create table test(id int primary key, s varchar(20));
Query OK, 0 rows affected (0.06 sec)

mysql> show indexes from test \G
*************************** 1. row ***************************
        Table: test
   Non_unique: 0
     Key_name: PRIMARY
 Seq_in_index: 1
  Column_name: id
    Collation: A
  Cardinality: 0
     Sub_part: NULL
       Packed: NULL
         Null:
   Index_type: BTREE
      Comment:
Index_comment:
1 row in set (0.00 sec)

7

인덱스는 where 절과 "order by"와 같은 모든 종류의 정렬에서 자주 사용되는 열에 가장 적합합니다. 좀 더 복잡한 데이터베이스에서 작업하고있을 수 있으므로 몇 가지 간단한 규칙을 기억하는 것이 좋습니다.

  • 인덱스는 삽입 및 업데이트 속도를 늦추므로 자주 업데이트되는 열에주의해서 사용하려고합니다.
  • 인덱스는 절과 순서에 따라 속도를 높입니다. 테이블을 만들 때 데이터가 어떻게 사용되는지에 대해 생각해야합니다. 기억해야 할 것이 몇 가지 더 있습니다. 테이블이 매우 작은 경우 (예 : 직원 수가 적은 경우) 테이블을 그대로두고 테이블 스캔을 수행하는 것보다 인덱스를 사용하는 것이 좋지 않습니다.

  • 인덱스는 실제로 많은 행이있는 테이블에서만 유용합니다.

  • 직원 데이터베이스의 상황에서 단점으로 기억해야 할 또 다른 사항은 열이 가변 길이 인 경우 인덱스 (및 대부분의 MySQL)의 효율성이 훨씬 떨어진다는 것입니다.

  • 조인도 잊지 마십시오! 인덱스 조인 필드는 작업 속도를 높입니다.


4

기본 키는 항상 자동으로 인덱싱되고 고유합니다. 따라서 중복 인덱스를 만들지 않도록주의하십시오.

예를 들어, 이와 같은 테이블을 만든 경우

CREATE TABLE mytable (foo INT NOT NULL PRIMARY KEY, bar INT NOT NULL, baz INT NOT NULL,
  UNIQUE(foo), INDEX(foo)) ENGINE=InnoDB;

기본 키를 색인화하고 고유성 제약 조건을 적용하기 때문에 실제로 세 개의 색인을 생성하게됩니다 foo!


0

기본 키 열을 기본 키 제약 조건이있는 다른 인덱스 열로 생각할 수 있습니다.

대부분의 사용 사례에서 테이블에 대한 쿼리는 기본 키가 아닌 열 / 열을 기준으로 행을 필터링 할 수 있기 때문에 테이블에 기본 키와 인덱스 된 열 / 열이 모두 필요합니다.이 경우 일반적으로 해당 열 / 열을 인덱싱합니다 게다가.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.