mysql Index, Foreign Key
Heidi Sql 사용하면서 위와 같이 인덱스와 외래 키 탭이 나눠져있다보니 개념이 헷갈려서 다시 정리
1. 인덱스란?
인덱스는 지정한 컬럼들을 기준으로 메모리 영역에 일종의 목차를 생성하여 insert, update, delete의 성능을 희생하고, select 의 성능을 향상시키는 것이다.
주의할 점은 update, delete 행위가 느린 것이지, update, delete 를 하기 위해 해당 데이터를 조회하는 것은 인덱스가 있으면 빠르게 조회가 된다.
인덱스가 없는 컬럼을 조건으로 update, delete 를 하게 되면 굉장히 느리기 때문에 많은 양의 데이터를 삭제 해야 하는 상황에선 인덱스로 지정된 컬럼을 기준으로 진행하는 것이 좋다.
2. Foreign key(외래키)
외래키는 제약조건의 하나로 다른 테이블의 레코드를 참조하기 위한 키 값으로 사용되며 해당 레코드를 대표하는 기본키가 외래키로 설정될 수 있다. 외래키는 데이터의 참조 무결성을 확인하기 위해 사용된다.
mysql에서는 외래키 제약이 설정되면 자동으로 연관되는 테이블의 컬럼에 인덱스까지 생성된다. 외래키가 제거되지 않은 상태에서는 자동으로 생성된 인덱스를 삭제할 수 없다.
헷갈렸던 이유
외래키 제약이 설정되면 자동으로 연관되는 테이블의 컬럼에 인덱스까지 생성
3. 유니크 인덱스
유니크 란 사실 인덱스 라기보다는 제약 조건에 가깝다고 볼 수 있다. 말 그대로 테이블이나 인덱스에 같은 값이 2개 이상 저장될 수 없음을 의미하는데, mysql 에서는 인덱스 없이 유니크 제약만 설정할 방법이 없다. 유니크 인덱스에서 null도 저장될 수 있는데 null 은 특정 값이 아니므로 2개 이상 저장될 수도 있다.
유니크 인덱스와 유니크하지 않은 일반 보조 인덱스는 사실 인덱스의 구조상 아무런 차이점은 없다.
primary key를 사용해 값의 중복을 방지할 수도 있지만, 여러 개의 컬럼을 동시에 체크하여 중복을 체크 해야 하는 경우, 여러 개를 묶어서 unique 처리를 할 수도 있다.
ALTER TABLE 테이블명 ADD UNIQUE (컬럼1, 컬럼2, 컬럼3);
참고
1. https://jojoldu.tistory.com/243
2. https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=diceworld&logNo=220217471190
3. https://brunch.co.kr/@dan-kim/26
4. https://stackoverflow.com/a/1145183/15690054
5. https://ivvve.github.io/2020/07/08/server/rdb/is-fk-indexed/