반응형

클러스터 인덱스

  • 테이블의 레코드 자체가 인덱스 순서에 맞춰 저장됨
  • 한 테이블에 하나만 존재 가능 (왜냐하면 테이블 자체의 정렬 순서를 정하기 때문)
  • 기본 키(Primary Key)가 자동으로 클러스터 인덱스로 지정되는 경우가 많음 (DBMS마다 다름; Mysql: O, postgreSql: X)
  • 범위 검색이 매우 빠름 (BETWEEN, >=, <= 등)
  • 클러스터 인덱스 기준으로 정렬되므로 자주 업데이트되거나 정렬 순서가 자주 바뀌는 컬럼은 비추천
  • INSERT/UPDATE 성능이 약간 저하될 수 있음 (정렬 유지 때문에)

유투브 쉬운코드

논 클러스터 인덱스

실제 데이터와 분리된 별도의 인덱스 구조(별도 공간) 책의 목차처럼 인덱스만 따로 있고, 실제 데이터를 찾아가야 함

비교

 

외래키

  • 다른 테이블의 PRIMARY KEY(기본 키)를 참조해서 두 테이블 간의 관계를 연결해주는 키
  • 외래 키는 무결성(일관성), 데이터 신뢰성을 지키는 역할
    • 제약이 없으면 잘못된 값이 들어갈 수 있음
  • 외래 키(Foreign Key)가 있다고 해서 자동으로 정렬되지는 않음
  • 외래 키는 정렬 기능이 아니라 제약 조건(Constraint)

외래키와 인덱스

  • 외래키는 위와 같은 이유로 보통 JOIN하거나 WHERE 조건에서 자주 사용되기 때문에 인덱스가 없으면 느려질 수 있음
  • 특히 참조 대상이 삭제되거나 변경될 때도 외래 키 무결성 검사 위해 관련 데이터 검색이 필요한데, 인덱스 없으면 전체 테이블을 스캔

MySQL에서는 FOREIGN KEY를 설정할 때, 참조 대상이 인덱스가 아니면 오류 발생

CREATE TABLE orders (
    id INT PRIMARY KEY,
    member_id INT,
    FOREIGN KEY (member_id) REFERENCES members(id)
);
  • 이 경우 orders.member_id에 자동으로 인덱스 생성됨
  • 이유: MySQL은 성능 및 무결성 검증을 위해 인덱스를 자동 생성 그래서 EXPLAIN으로 보면 member_id에 인덱스가 잡혀 있음

 

 

 

 

728x90
반응형

'개발 > sql' 카테고리의 다른 글

[mysql] 복합 인덱스와 explain  (0) 2025.02.03
[mysql] order by null  (0) 2024.12.19
[파티셔닝] 하는법, 쓰는법  (0) 2024.11.25
비관락/낙관락 쓰기락/읽기락 베타락/공유락  (1) 2024.11.09
2 Phase Lock & mysql -> MVCC  (3) 2024.11.06

+ Recent posts