[SQL Tuning] SQL 튜닝을 위한 기초 | 1. 물리 엔진과 오브젝트 용어

아리엘 (Ariel)·2024년 5월 6일
1

SQL

목록 보기
9/14

1. DB 엔진 용어

1-1. SQL문 실행 과정

  • 파서(parser) 역할
    • MySQL 엔진에서 문법 에러 검사
    • DB에 존재하는 테이블에 대해 SQL문을 작성했는지 검사
  • 옵티마이저(optimizer) 역할
    • 사용자가 요청한 데이터를 빠르고 효율적으로 찾아가는 계획 수립
    • 데이터를 찾아서 MySQL 엔진으로 전달
  • MySQL 엔진은 전달 받은 데이터를 필터링, 필요한 연산을 수행하고 사용자에게 최종 결과 전달

1-2. 스토리지 엔진

사용자가 요청한 SQL문을 토대로 DB의 데이터를 가져와 MySQL 엔진으로 전달

사용할 스토리지 엔진 선택 문제

  • 스토리지 엔진이 데이터를 저장하는 방식에 따라 스토리지 엔진 선택
    • InnoDB 엔진 : 온라인상 트랜잭션의 발생으로 데이터를 처리하는 환경(OLTP; online transaction processing)
    • MyISAM 엔진 : 대량의 쓰기 트랜잭션 발생 시
    • Memory 엔진 : 메모리 데이터를 로드하여 빠르게 읽어야 할 때
  • 외부 스토리지 엔진 설치 파일을 가져와 활성화하여 사용 가능

✅ 일반적으로 OLTP 환경이 많기에 InnoDB 엔진을 사용한다.

1-3. MySQL 엔진

<SQL문 시작 단계에서의 역할>

  • SQL문 문법 검사
  • SQL문이 적절한 오브젝트를 사용했는지 검사
  • SQL문을 최소 단위로 분리

➡️ 원하는 데이터를 빠르게 찾는 경로를 모색

<SQL문 마무리 단계에서의 역할>
➡️ 스토리지 엔진으로부터 전달받은 데이터를 가공, 연산


2. SQL 프로세스 용어

1) 사용자의 SQL문 실행

2) 파서 (parsor)

  • MySQL이 이해할 수 있는 최소 단위로 구성요소 분리
  • 구성요소를 트리로 생성
  • 트리를 생성하는 과정에서 문법 오류 검토
    • 트리의 최소 단위 : >, <, = 등의 기호, SQL 키워드
    • 트리에 허용되지 않는 문법 포함 시 에러 발생 & 실행 종료

3) 전처리기 (preprocessor)

  • 생성된 트리 결과를 토대로, SQL문의 "유효성" 검토 ➡️ 유효성 불만족 시 에러 발생
    • 이미 생성된 테이블, 뷰 등으로 구성되지 않았는지
    • 존재하지 않는 열을 포함하지 않았는지
    • 조회 권한이 없는 테이블을 조회하는지 등

4) 옵티마이저 (optimizer)

  • 효율적인 데이터 검색 실행 계획 수립
    • 어떤 순서로 텡블에 접근할지
    • 인덱스를 사용할 것인지
    • 정렬 시 인덱스, 임시 테이블 중 어떤 것을 사용할 것인지 등

5) 엔진 실행기 (engine executor)

  • 수립된 실행 계획으로 스토리지 엔진 호출하여 데이터 가져오기
  • 불필요한 데이터 필터링하여 사용자에게 전달


3. DB 오브젝트 용어

3-1. 테이블

데이터를 저장하는 오브젝트
행과 열의 정보를 담는다.

3-2. 행, 로우 (row)

하나의 객체에 대한 데이터 항목의 집합

3-3. 열, 컬럼 (column)

데이터 유형

3-4. 기본 키 (pk; primary key)

  • 특정 행을 대표하는 열
    ex) 주민등록번호
  • 2개 이상으로 구성할 수 있다.
  • 인덱스 역할을 수행할 수 있다. MySQL에서 비슷한 기본 키 값들이 근거리에 적재되므로 "클러스터형 인덱스"로 작동 가능 ➡️ 테이블 스캔 속도 향상
  • Null 입력 불가능
CREATE TABLE 전공 (
	전공코드 CHAR(2) NOT NULL,
    전공명 VARCHAR(10) NOT NULL,
    PRIMARY KEY (전공코드)
);

3-5. 외래 키 (fk; foreign key)

외부 테이블을 참조하는 키

CREATE TABLE 학생 (
	학번 INT(10) NOT NULL,
    이름 VARCHAR(10) NOT NULL,
    생년월일 CHAR(8),
    연락처 VARCHAR(15),
    전공코드 CHAR(2),
    PRIMARY KEY (학번),
    CONSTRAINT 학생_FK1 FOREIGN KEY (전공코드) REFERENCES 전공(전공코드)
);

3-6. 인덱스 (index)

  • 데이터에 대한 위치 정보
  • Null 입력 가능
  • 인덱스 종류
    • 고유 인덱스 : 인덱스를 구성하는 열들의 데이터가 유일할 때
      ALTER TABLE 학생
      ADD UNIQUE INDEX 연락처_인덱스(연락처);
    • 비고유 인덱스 : 새롭게 입력된 데이터가 기존 데이터와 중복되는지 확인하지 않고, 순서를 붙여준다.
      ALTER TABLE 학생
      ADD INDEX 이름_인덱스 (이름);

3-7. 뷰 (view)

  • 가상 테이블, 보안성 측면에서 사용한다.
  • 학생 테이블 ↔️ 학생 뷰 : 사이의 변경은 서로 즉시 반영된다.
CREATE VIEW 학생_뷰 AS
	SELECT 학번, 이름
	FROM 학생 ;


📌 Source

  • 양바른, 「업무에 바로 쓰는 SQL 튜닝」, 한빛미디어, 2021


💡 질문과 피드백은 댓글에 남겨주시기 바랍니다.
❤️ 도움이 되셨다면 공감 부탁드립니다.


profile
Data Analyst / Engineer

0개의 댓글