✏️
- MySql 동작방식
- MySql 파싱의 목적이 뭔가요?
- DML이 뭔가요?
- DML과 DDL의 차이는 뭔가요?
- Join이 뭔가요? </aside>
[들어가기전에 …]
🍏 RDBMS의 특징
- 테이블이라는 최소 단위로 구성 됨
- 테이블은 열과 행으로 이루어짐
- 테이블간 FK(Foreign Key)를 통해 다른 데이터를 조합해서 함께 볼 수 있음
🍏 RDBMS의 종류
- 유료인 Oracle
- MySQL (Spring과 궁합이 좋다함 근데 왜..?)
- PostgreSQL
- 등등 …
🍏 SQL; Structed Query Language
(* 아래의 내용은 MySQL 8.0 기준으로 작성됨)
- MySQL Connectors에 요청이 도착한다
- 사용자 스레드가 할당되고 요청이 MySQL엔진에 전달된다.
- 토큰 파서가 SQL을 MySQL이 이해 가능한 최소 단위로 잘라내고, 문법 유효성을 검증한다.
- 전처리기가 컬럼명, 테이블명 등이 존재하는지 확인하고, 접근 권한이 있는지 검증한다.
<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
- https://willseungh0.tistory.com/161
- https://zangzangs.tistory.com/103
- https://jaehoney.tistory.com/193
- https://creampuffy.tistory.com/168
'DB > SQL(MySQL)' 카테고리의 다른 글
MySQL 기본 문법 정리 (0) | 2024.06.18 |
---|