반응형
클러스터 인덱스
- 테이블의 레코드 자체가 인덱스 순서에 맞춰 저장됨
- 한 테이블에 하나만 존재 가능 (왜냐하면 테이블 자체의 정렬 순서를 정하기 때문)
- 기본 키(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 |