Sad Puppy 3 'DB' 카테고리의 글 목록 :: 개발자 아지트

 ✏️

  • MySql 동작방식
  • MySql 파싱의 목적이 뭔가요?
  • DML이 뭔가요?
  • DML과 DDL의 차이는 뭔가요?
  • Join이 뭔가요? </aside>

[들어가기전에 …]

🍏 RDBMS의 특징

  • 테이블이라는 최소 단위로 구성 됨
  • 테이블은 열과 행으로 이루어짐
  • 테이블간 FK(Foreign Key)를 통해 다른 데이터를 조합해서 함께 볼 수 있음

🍏 RDBMS의 종류

  • 유료인 Oracle
  • MySQL (Spring과 궁합이 좋다함 근데 왜..?)
  • PostgreSQL
  • 등등 …

🍏 SQL; Structed Query Language

(* 아래의 내용은 MySQL 8.0 기준으로 작성됨)

  1. MySQL Connectors에 요청이 도착한다
  2. 사용자 스레드가 할당되고 요청이 MySQL엔진에 전달된다.
  3. 토큰 파서가 SQL을 MySQL이 이해 가능한 최소 단위로 잘라내고, 문법 유효성을 검증한다.
  4. 전처리기가 컬럼명, 테이블명 등이 존재하는지 확인하고, 접근 권한이 있는지 검증한다.

<aside> 💡

(3-4) 과정은 SQL 파싱(Parsing)이라고 한다.

  • MySQL Server의 ‘SQL 파서’ 모듈로 처리한다.
  • 해당 단계에서 SQL 파스 트리가 만들어진다.
  • MySQL Server가 실제로 쿼리를 실행할 때는 SQL 문장이 아니라 SQL 파스 트리를 사용해서 쿼리를 실행한다. </aside>


5. 옵티마이저가 사용자가 전달한 SQL문을 어떻게 실행해야 효율적일지 결정한다. (최적화 및 실행 계획 수립 단계)

<aside> 💡

*옵티마이저(Optimizer)란?

:쿼리를 최적으로 실행하기 위해 각 테이블의 데이터가 어떤 분포로 저장돼 있는지를 참조하고, 데이터를 기반으로 최적의 실행 계획을 수립해주는 것. DBMS의 두뇌

[상세]

  • 파스트리를 참조해서 다음의 내용을 처리한다.
  • 불필요한 조건 제거 및 복잡한 연산 단순화
  • 여러 테이블의 조인이 있는 경우, 어떤 순서로 테이블을 읽을지 결정
  • 각 테이블에 사용된 조건과 인덱스 통계 정보를 이용해 사용할 인덱스를 결정
  • 가져온 레코드들을 임시 테이블에 넣고 다시 한번 가공해야 하는지 결정
  • 등등

[옵티마이저가 실행 계획을 수립하는 2가지 방법]

  • 규칙기반 최적화 방법: 옵티마이저에 내장된 우선순위에 따라서 실행 계획을 수립하는 방법이다.
  • 비용 기반 최적화: SQL을 처리하는 다양한 방법을 마련해두고, 각 방법의 비용과 테이블 통계 정보를 토대로 실행 계획을 수립하는 방법이다. </aside>

6. 수립된 계획대로 스토리지 엔진에서 레코드를 읽어오도록 요청하고, MySQL 엔진에서는 스토리지 엔진으로 받은 레코드를 조인하거나 정렬하는 작업을 수행한다.MySQL 엔진

  • 클라이언트 접속과 SQL 요청을 처리한다. 이는 쿼리 파서, 전처리기, 옵티마이저, 실행 엔진 등으로 이루어져 있다. 여기서 중요한 옵티마이저는 요청 SQL문을 최적화해서 실행시키기 위해 실행 계획을 짠다.

MySQL스토리지 엔진

  • 데이터를 실제로 디스크에 저장하거나, 디스크에 저장된 데이터를 가져오는 역할을 한다. 즉 MySQL 엔진의 옵티마이저가 짠 SQL 실행 계획에 따라 스토리지 엔진을 적절히 호출해서 쿼리를 실행한다. 여기서 스토리지 엔진을 호출할 때 사용하는 것을 Handler API라고 하고, 실제로 이 Handler API를 구현해서 플러그인으로 스토리지 엔진을 커스텀하고 추가할 수 있다. </aside>

7. 결과를 반환한다.

8. 백그라운드 스레드에서 커밋되었으나 디스크에 반영되지 않은 내용을 디스크에 접근하여 일괄 처리한다.

MySql 파싱의 목적이 뭔가요?

→ 클라이언트로부터 전달된 SQL문을 기계가 이해할 수 있는 내부 구조로 변환하고, 그 과정에서 문법적 의미적 오류를 가려내기 위함


[들어가기전에 …]

🍉 DDL; Data Definition Language

: 테이블이나 관계의 구조를 생성하는데 사용함

  • CREATE: 새로운 데이터베이스 및 테이블 생성
  • create database 데이터베이스 이름; create table 테이블이름 ( 필드이름1 필드타입1, 필드이름2 필드타입2, ... );
  • ALTER: 데이터베이스와 테이블의 내용 수정
  • alter table 테이블이름 add 필드이름 필드 타입; alter table 테이블이름 drop 필드이름; alter table 테이블이름 modify column 필드이름 필드타입;
  • DROP: 데이터베이스와 테이블 삭제. 데이터 및 테이블 전체를 삭제함
  • drop database 데이터베이스이름; drop table 테이블이름;
  • TRUNCATE: 데이터베이스와 테이블 삭제. 생성 초기 상태 처럼 컬럼값만 남김
  • truncate database 데이터베이스이름; truncate table 테이블이름;

🍑 DCL; Data Control Language

: 데이터의 사용 권한 관리

  • GRANT: 사용자 또는 ROLE에 대해 권한을 부여할 수 있음
  • grant [객체권한명] (컬럼) on [객체명] to { 유저명 | 롤명 | public } [with grant option]; //ex) grant select, insert on mp to scott with grant option;
  • REVOKE: 사용자 또는 ROLE에 부여한 권한을 회수할 수 있음
  • revoke {권한명 [, 권한명...] all} on [객체명] from { 유저명 [, 유저명...] | 롤명 | public } [cascade constraints]; //ex) revoke select, insert on emp from scott [cascade constraints];

DML이 뭔가요?

🌽 DML; Data Manipulation Language

: 테이블에 데이터를 검색, 삽입, 수정, 삭제하는데 사용함

  • INSERT: 테이블에 새로운 row를 추가할 수 있음
  • insert into 테이블이름(필드이름1, 필드이름2, ...) values(데이터값1, 데이터값2, ...); insert into 테이블이름 values(데이터값1, 데이터값2, ...);

SELECT: 테이블의 row를 선택할 수 있음

  • UPDATE: 테이블의 row의 내용을 수정할 수 있음
  • update 테이블이름 set 필드이름1=데이터값1, 필드이름2=데이터값2, ... where 필드이름=데이터값;
  • DELETE: 테이블의 row를 삭제할 수 있음
  • delete from 테이블이름 where 필드이름=데이터값;

DML과 DDL의 차이는 뭔가요?

→DDL은 테이블을 관리하는 명령어

→DML은 테이블의 데이터를 관리하는 명령어

Join이 뭔가요?

  • 두 테이블을 하나로 합치기 위해 데이터베이스가 제공하는 기능
  • JOIN은 ON키워드를 통해 기준이 되는 컬럼을 선택해 2개의 테이블을 합쳐줌
  • JOIN을 할 때는, 적어도 하나의 컬럼을 서로 공유하고 있어야함
    • 테이블에 외래 키가 설정돼 있으면 해당 컬럼을 통해 JOIN가능

❗ 다만 JOIN을 하기위해 외래키를 설정하는게 항상 좋은 선택이 아닐 수 있음

  • 외래키 설정시, 데이터 무결성을 확인하는 추가 연산이 발생함
  • 무결성을 지켜야 하기 때문에, 상황에 따라 개발하는데 불편할 수 도 있음

⇒ 항상 테이블에 모든 제약조건을 걸어야 하는건 아니고, 프로젝트 상황에 따라 효율적인 제약조건 적용필요

Reference


'DB > SQL(MySQL)' 카테고리의 다른 글

MySQL 기본 문법 정리  (0) 2024.06.18

[ObjectId]

 

ObjectId는 MongoDB에서 기본적으로 사용하는 고유 식별자입니다. MongoDB의 각 문서는 고유한 _id 필드를 갖는데, 이 필드는 자동으로 생성되며 기본적으로 ObjectId 타입입니다. ObjectId는 12바이트의 BSON(비너리 JSON) 데이터로 구성되어 있습니다.

ObjectId의 구성 요소

ObjectId는 다음과 같은 12바이트로 구성됨

  1. 타임스탬프 (4바이트): ObjectId가 생성된 시간을 초 단위로 표현합니다. 이를 통해 객체가 생성된 시간 순서대로 정렬할 수 있음
  2. 랜덤 값 (5바이트): 머신의 고유성을 보장하기 위해 생성된 무작위 값
  3. 증가하는 카운터 (3바이트): 같은 머신에서 같은 시간에 생성된 ObjectId 간의 충돌을 방지하기 위한 증분 카운터

이러한 구조 덕분에 ObjectId는 고유성과 생성 시간 정보를 효율적으로 보장할 수 있음

ObjectId 예시

MongoDB에서 자동 생성된 ObjectId

507f191e810c19729de860ea
 
 

[필드의 속성]

 

1. required: true

required: true는 해당 필드가 반드시 값을 가져야 한다는 것을 의미합니다. 즉, 문서를 저장할 때 이 필드가 비어 있으면 유효성 검사 오류가 발생

  • 특징:
    • 필드에 값이 없으면 문서가 저장되지 않음
    • 필수 필드로 지정된 값이 없으면 Mongoose는 에러를 발생시킴

2. unique: true

unique: true는 해당 필드에 대해 고유 인덱스를 생성하여, 중복된 값을 허용하지 않도록 합니다. 즉, 데이터베이스에 저장된 문서들 간에 이 필드의 값이 중복될 수 없음

  • 특징:
    • 필드에 대해 고유 인덱스가 생성됨
    • 중복된 값을 가진 문서를 저장하려고 하면 중복 키 오류가 발생함
    • 인덱스가 생성되어 조회 성능이 향상될 수 있음

+ Recent posts