Study/Real-MySQL

8.10 외래키

hongeeii 2024. 1. 5.
728x90
반응형

8.10 외래키

MySQL에서 외래키는 InnoDB 에서만 생성 가능하고

외래키 제약이 설정되면 자동으로 연관된 테이블의 컬럼에 인덱스까지 생성된다.

외래키가 제어되지 않은 상태에서는 자동으로 생성된 인덱스를 삭제할 수 없다.

외래키의 특징

  • 테이블의 변경(쓰기잠금)이 발생하는 경우에만 잠금경합(잠금 대기)이 발생
  • 외래키와 연관되지 않은 컬럼의 변경은 최대한 잠금 경합(잠금 대기)을 발생시키지 않는다.
create table tb_parent(
    id int not null,
    fd varchar(100) not null,
    primary key (id)
)engine = innodb;

create table tb_child(
    id int not null,
    pid int default null,
    fd varchar(100) default null,
    primary key (id),
    key ix_parentid (pid),
    constraint child_ibfk_1 foreign key (pid) references tb_parent (id) on delete  cascade
) engine = innodb;

insert into tb_parent values (1, 'parent-1'),(2, 'parent-2');
insert into tb_child values (100, 1, 'child-100');


8.10.1 자식테이블의 변경이 대기하는 경우

image


image

  • 커넥션 1이 부모 테이블 레코드에 대해 쓰기 잠금을 획득
  • 커넥션 2이 자식 테이블의 외래키 컬럼을 변경하려하자 부모 테이블의 변경 작업이 완료 될때까지 대기
  • 커넥션 1이 작업을 완료(rollback, commit) 하자 커넥션 2의 쿼리가 실행됨

즉 자식 테이블의 외래키 컬럼의 변경은 부모테이블의 확인이 필요함.

=> 부모테이블에 잠금이 걸려있으면 대기가 발생



8.10.2 부모테이블의 변경 작업이 대기하는 경우

원래대로 되돌린 후..

image

image


image

  • 외래키를 정의할때 추가한 특성(on delete cascade) 때문에 부모레코드 삭제 시 자식 레코드를 삭제하도록 작동해서 대기가 발생

외래키의 고려사항은 부모테이블에 참조키가 있는지 확인하는 체크 작업 때 읽기 잠금을 걸어야한다는 점

이렇게 잠금이 다른 테이블로 확장되면 전체적으로 쿼리의 동시처리에 영향을 미침

728x90
반응형

'Study > Real-MySQL' 카테고리의 다른 글

9.3 고급 최적화  (0) 2024.02.13
9.1 옵티마이저와 힌트 개요  (0) 2024.02.13
8.9 유니크 인덱스  (0) 2024.01.05
8.8 클러스터링 인덱스  (1) 2024.01.05
8.7 멀티 밸류 인덱스  (0) 2024.01.05

추천 글