물리적 모델링

순동·2022년 5월 5일
0

📌 물리적 모델링

물리적 모델링은 실제로 만들 데이터베이스에 가장 가깝게 데이터 모델을 만드는 과정이다.


📌 네이밍

네이밍이란 이름을 짓는 과정이다. 어떤 규칙을 정하는지보다 정해진 규칙을 잘 따르는 게 더 중요하다. 따라서 처음에 규칙을 최대한 명확하게 정하고 이를 따르는 게 좋다.

  1. 단수 / 복수 정하기
    컬럼 이름은 단수를 사용하는 것을 선호한다.
    ex) user vs users

  2. 대문자 / 띄어쓰기 정하기
    ex) user_id vs UserId

  3. 줄이말 정하기
    ex) social_cecurity_number vs ssn


📌 데이터 타입

  • 각 컬럼에 어떤 데이터를 저장하는지에 대한 내용
  • 데이터베이스의 가장 기본적인 제약 사항
  • 똑같은 데이터를 저장하되, 용량은 작게 사용하는 게 좋다.

📝 데이터 타입을 잘 정해야 하는 이유

  • 데이터 정확성을 지키기 위해서
  • 데이터베이스 연산 / 함수들을 제대로 활용하기 위해서
  • 데이터베이스 용량을 최적화하기 위해서

📌 Clusterd vs Non-Clusterd 인덱스

Clustered 인덱스는 테이블 자체를 특정 순서로 저장하는 인덱스이다.

  • 조회 속도가 빠르다.
  • 인덱스를 하나 밖에 못 만든다.
  • 언어 사전과 비슷한 개념이다.

Non-Clustered 인덱스는 테이블 자체는 그대로 놔두고 다른 곳에 순서를 저장한다.

  • 인덱스를 모든 컬럼에 대해서 만들 수 있다.
  • Clustered 인덱스보다는 조금 느리다.
  • 일반 책의 색인, 또는 인덱스와 비슷한 개념이다.

📌 인덱스 단점과 사용

인덱스를 사용하면 특정 조건의 데이터를 찾는 조회를 빠르게 할 수 있다.
그렇지만 모든 컬럼과 모든 컬럼의 조합에 인덱스를 추가하지는 않는다.

  1. 용량 문제
    용량을 너무 많이 사용하면 데이터베이스가 느려질 수 있다.

  2. 인덱스 업데이트 문제
    하나의 row 값을 바꾸려면, 해당 컬럼이 포함된 모든 인덱스를 수정해야 한다. 따라서 조회는 빠르게할 수 있지만 삽입, 업데이트, 삭제는 오히려 느리게 만든다.

  • 인덱스를 추가하려는 테이블의 컬럼들이 얼마나 자주 삽입, 업데이트, 삭제되는지를 파악해야 한다.
  • 연산을 많이 해야되는 테이블의 컬럼들에는 인덱스가 오히려 역효과를 낳는다.

📝 인덱스 추가 기본 원칙

  • 모든 Primary Key에 대해서 인덱스를 만들어 준다.
  • 모든 Foreign Key에 대해서 인덱스를 만들어 준다.
  • 특정 조회 쿼리가 너무 느려지거나, 느려질 게 확실한 경우 조회에 사용되는 컬럼들에 대해서 인덱스를 만들어 준다.

📌 SQL로 인덱스 만들고 사용하기

✅ Clustered 인덱스 만들기

MySQL에서는 자동으로 각 테이블이 Primary Key에 대한 clustered 인덱스가 만들어진다.

만약 기본키가 아닌 다른 컬럼을 clustered 인덱스로 사용하고 싶다면, clustered 인덱스는 테이블당 하나씩 밖에 있을 수 없기 때문에 먼저 기존 인덱스를 삭제한 후 아래 코드를 진행한다.

CREATE CLUSTERED INDEX index_name ON table_name (column_name)

✅ Non-Clustered 인덱스 만들기

Non-Clustered 인덱스는 개수 상관없이 여러 개를 만들 수 있기 때문에 이미 있는 인덱스를 삭제할 필요가 없다.

CREATE INDEX index_name ON table_name (column_name)

✅ Composite 인덱스 만들기

CREATE INDEX index_name ON table_name (column_name1, column_name2, ...)

✅ 인덱스 확인하기

만야 테이블 안에 있는 모든 인덱스에 대한 정보를 확인하고 싶다면 다음과 같이 코드를 실행한다.

SHOW INDEX FROM table_name;

✅ 인덱스 삭제하기

DROP INDEX index_name ON table_name;

✅ 인덱스 사용하기

SELECT문을 사용한다.


0개의 댓글