본문 바로가기

개발중/sql

MY SQL 의 PRIMARY KEY 와 KEY 차이점.

728x90
반응형

MY SQL 을 사용하는 와중에

A 테이블에 대해서 새로운 정보를 저장할 B 테이블을 만들어야 하는 경우가 생겼다.

 

즉, A의 테이블의 PK 인 seq 컬럼을 

B 테이블의 외래키로 가져와서 B 테이블에 다른 정보를 저장하는 것이다.


이번 업무를 하면서 새롭게 배운 점은 

  • MY SQL 은 외래키가 존재하지 않는다.
  • 다른 테이블의 KEY 를 참조 할 때는 컬럼명을 동일하게 한다.
  • MY SQL 의 PRIMARY KEY 와 KEY 차이점을 알고 있어야 한다. 

 INDEX('SEQ', 'TITLE')

index로 선언,사용하면 항상 소트된 값을 유지하므로 검색이 빠릅니다.

 

 

 KEY('SEQ', 'TITLE')

key로 선언되면 unique한 key값으로 저장,사용하게 하며 자동으로 index가 설정된다.


일반적인 DBMS에서 PK는 자동으로 Index가 적용된다.

PK는 개념적인 값이다.
PK는 여러 Tuple 중 유일한 Tuple임을 보장한다.

실제 값이 존재하지만 PK라고 따로 물리적으로 저장되지 않기 때문이다.



반면 Index는 Tuple들의 유일성을 보장하지 않는다.

Index는 단지 테이블에서 Tuple을 보다 빨리 찾기위해 사용된다.

Index를 걸면 Index를 거는 컬럼을 기준으로 새로운 자료 구조(B-tree등)를 생성하여 별도의 디스크 공간에 저장한다.


✅ primary key(pk)

 

테이블에서 대표되는 key.

즉 키에 해당하는 컬럼은 unique해야 되고

(여기에서 unique index랑 혼돈하면 안된다 !.)

 

not null이여야 된다.

(null은 대표되는 key가 될수 없습니다.)

 

그래서 연관관계에 사용될수 있는 key입니다.

 unique index

 

테이블 컬럼에서 unique한 컬럼만 잡을수 있는 index입니다.

해당컬럼을 조회조건으로 가장 빠르게 조회할수 있게 index를 잡으며 무결성체크에도 사용된다.

 

 EX

예로 회원번호와 아이디가 있을 경우 

 

회원번호를 pk로 잡고 

아이디를 유니크인덱스로 잡아놓으면 

 

아이디의 중복등록도 방지되고 아이디로 조회했을때 유니크인덱스를 타기 때문에 빠르게 조회가 된다.


CREATE TABLE BINSOO (

SEQ INT

, NAME VARCHAR2(20)

, PHONE VARCHAR2(20)

 

, PRIMARY KEY (SEQ )

, KEY (SEQ )

, UNIQUE KEY (SEQ )

)

 

하지만 난 아직도 , PRIMARY KEY (SEQ ), KEY (SEQ ), UNIQUE KEY (SEQ ) 에 대한 개념은 아직 부족하다.

잘 이해가 가지 않는다. 


🙋‍♂️ 아저씨가 가르쳐 주신 내용

아저씨는 My Sql 이 아닌 오라클 기준으로 설명해주셨다.

 

 

PK 중복을 배제하고 속도를 향상 시키기 위해서 사용한다.

 

 

UNIQUE KEY 는 특정 칼럼으로 조회 할 때 full scan 을 방지하기 위해 속도를 높이기 위해 사용한다.

그래서 UNIQUE KEY 를 2-3 개씩 잡아서 여러개 지정하는 경우가 존재한다.

 

그로 인해서 UNIQUE KEY 의 단점이 나타난다.

UNIQUE KEY 가 생성이 될 때 우리 눈에 보이지 않는 log 라는 곳에 UNIQUE KEY 별로 다 기록이 되고 있다.

 

그래서 INSERT 가 될 때 마다 우리 생각에는 '하나의 데이터가 INSERT 되겠지 ?'

라고 생각하겠지만 하나의 INSERT + LOG 에 UNIQUE KEY 별로 기록

 

UNIQUE KEY 가 많으면 장점도 존재 하지만, UNIQUE KEY 가 많을 수록 INSERT 가 잦은 경우에는 INSERT 속도가 느려지는 단점이 있다.


 

728x90
반응형

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

[MYSQL] INSERT MAX + 1  (1) 2021.10.12
insert key  (0) 2021.10.12
MYSQL 설치 삽질 기록  (0) 2021.07.04
MY SQL ERROR - my.ini 위치 / 수정  (0) 2021.07.04
mybatis / 존재하지 않는 테이블명 에러 잡기  (0) 2021.06.29