code

MySQL 5.0 인덱스-고유 vs 비 고유

codestyles 2020. 12. 11. 08:13
반응형

MySQL 5.0 인덱스-고유 vs 비 고유


성능 측면에서 MySQL 고유 인덱스와 고유하지 않은 인덱스의 차이점은 무엇입니까?

2 열의 콤보에 인덱스를 만들고 싶은데 조합이 고유하지만 고유하지 않은 인덱스를 생성한다고 가정 해 보겠습니다. MySQL이 사용하는 성능이나 메모리에 큰 영향을 미칠까요?

같은 질문, 기본 키와 고유 인덱스 사이에 차이점이 있습니까?


UNIQUE 및 PRIMARY KEY는 인덱스가 아닌 제약 조건 입니다. 대부분의 데이터베이스는 인덱스를 사용하여 이러한 제약을 구현합니다. 인덱스에 추가 된 제약 조건의 추가 오버 헤드는 중요하지 않습니다. 특히 의도하지 않은 중복이 발생할 때 추적하고 수정하는 비용을 계산할 때 특히 그렇습니다.

선택 도가 높은 경우 인덱스가 일반적으로 더 효과적 입니다. 총 행 수에 대한 고유 값 수의 비율입니다.

예를 들어 주민등록번호 열에 고유 한 값이 1 백만 개있는 행이 1 백만 개있을 수 있습니다. 따라서 선택성은 1000000/1000000 = 1.0입니다 (희귀 한 역사적 예외가 있지만 SSN은 고유하도록 설계되었습니다).

그러나 해당 테이블의 다른 열인 "gender"에는 1 백만 행이 넘는 두 개의 고유 한 값만있을 수 있습니다. 2/1000000 = 매우 낮은 선택성.

UNIQUE 또는 PRIMARY KEY 제약 조건이있는 인덱스는 1.0의 선택성을 보장하므로 항상 인덱스만큼 효과적입니다.

기본 키와 고유 제약 조건의 차이점에 대해 질문했습니다. 기본적으로 테이블 당 하나의 기본 키 제약 조건 만 가질 수 있지만 (해당 제약 조건의 정의에 여러 열이 포함 된 경우에도) 여러 고유 제약 조건을 가질 수 있습니다. 고유 제약 조건이있는 열은 NULL을 허용 할 수 있지만 기본 키 제약 조건의 열은 NULL을 허용하지 않아야합니다. 그렇지 않으면 기본 키와 고유 한 구현 및 사용이 매우 유사합니다.

MyISAM 또는 InnoDB를 사용할 지에 대한 의견을 물었습니다. MySQL에서는 스토리지 엔진 이라는 용어를 사용합니다 . 이 두 스토리지 엔진 간에는 미묘한 차이가 있지만 가장 중요한 것은 다음과 같습니다.

  • InnoDB는 트랜잭션을 지원하므로 롤백 또는 변경 사항 커밋을 선택할 수 있습니다. MyISAM은 사실상 항상 자동 커밋입니다.
  • InnoDB는 외래 키 제약을 적용합니다. MyISAM은 외래 키 제약 조건을 적용하거나 저장하지 않습니다.

이러한 기능이 애플리케이션에 필요한 것이라면 InnoDB를 사용해야합니다.


귀하의 의견에 응답하는 것은 그렇게 간단하지 않습니다. InnoDB는 실제로 MyISAM보다 훨씬 빠른 경우가 많으므로 애플리케이션의 선택, 업데이트, 동시 쿼리, 인덱스, 버퍼 구성 등의 조합에 따라 다릅니다.

스토리지 엔진의 전체 성능 비교는 http://www.mysqlperformanceblog.com/2007/01/08/innodb-vs-myisam-vs-falcon-benchmarks-part-1/참조 하십시오 . InnoDB는 MyISAM보다 자주 승리하여 하나가 다른 것보다 빠르다고 말할 수 없습니다.

대부분의 성능 관련 질문과 마찬가지로 애플리케이션에 대해 답할 수있는 유일한 방법 은 애플리케이션과 대표적인 데이터 샘플을 사용하여 두 구성을 테스트하고 결과를 측정하는 것입니다.


고유하고 고유 한 인덱스 인 고유하지 않은 인덱스에서? 잘 모르겠지만 많이는 아닐 것 같아요. 옵티마이 저는 인덱스의 카디널리티를 검사하고이를 사용해야합니다 (고유 인덱스의 경우 항상 행 수).

기본 키에 관한 한 상당히 많 겠지만 사용하는 엔진에 따라 다릅니다.

많은 사람들이 사용하는 InnoDB 엔진은 항상 기본 키의 행을 클러스터링합니다. 이것은 PK가 본질적으로 실제 행 데이터와 결합된다는 것을 의미합니다. PK (또는 실제로 범위 스캔 등)로 많은 조회를 수행하는 경우 디스크에서 많은 블록을 가져올 필요가 없기 때문에 이것은 좋은 일입니다.

비 PK 고유 인덱스는 InnoDB에서 클러스터되지 않습니다.

반면에 일부 다른 엔진 (특히 MyISAM)은 PK를 클러스터링하지 않으므로 기본 키는 일반 고유 인덱스와 같습니다.

참고 URL : https://stackoverflow.com/questions/388982/mysql-5-0-indexes-unique-vs-non-unique

반응형