2022. 3. 6. 14:38ㆍSQL
Overview
SQL 자체를 사용해본 경험은 있지만, 사실 SQL 자체를 이해하려고 하진 않았다. 프로젝트를 진행하는 데, 꼭 SQL을 깊게 이해할 필요는 없다고 생각했기 때문이다. 하지만 이러한 생각은 반은 맞고 반은 틀리다고 본다. 물론, 기능 구현을 하기 위해선 SQL 자체를 깊게 알 필요는 없다. 하지만, 보통 애플리케이션은 DB 서버를 따로 운영하여, 여러 was가 공유하는 형태로 작동한다. 즉 네트워크 IO + DB IO(디스크 IO)를 여러 was에서 공유한다는 뜻이라고 할 수 있다. 요컨대, 애플리케이션의 성능을 저하시키는 요소를 2가지나 가지고 있는 상황인데, 과연 SQL을 이해하지 않고 사용하는 게 정말 문제점이 없을까? 장기적인 관점에서(유지보수와 확장 측면에서) 긍정적으로 생각하기가 힘들다. 그래서 이번에 'MySQL 파헤치기' 시리즈의 글을 쓰면서, SQL을 좀 더 제대로 이해해보기로 한다.
SQL의 종류는 많은데, 왜 MySQL을 선택했나?
가장 큰 이유는 Real MySQL 8.0 이라는 서적을 통해 학습을 진행하기 때문이다. 물론, SQL의 종류에 따라, 다른 특징이 있고 내부 함수의 구조가 다르지만, 사실 이 글을 쓰는 목적은 MySQL 자체를 공부하기 위해서라기보단, MySQL의 InnoDB 스토리지 엔진과 트랜잭션, 락, Isolation, 인덱스, 쿼리 구조 및 최적화와 같이, InnoDB 기반의 SQL을 사용한다면 꼭 알아야 하는 부분을 집중적으로 학습을 하기 위해서다. Real MySQL 8.0의 경우, MySQL을 주제로 내용을 진행하지만, MySQL 자체의 사용법보다는 InnoDB 스토리지 엔진 기반의 SQL의 내용을 집중적으로 서술하고 있어, 나의 학습적 수요를 충족시키는 서적이라 생각했다.
즉, MySQL은 그저 InnoDB 기반의 DBMS의 작동 원리와 내부구조를 이해하기 위한 '도구'일 뿐이다.
용어 정리
아직 모든 용어를 정리할 수 없는 상황이라, 우선은 당장 이해가 필요한 용어 위주로 정리하고 학습 상황에 따라 계속 업데이트하는 방향으로 진행하겠다.
- Record(레코드) : DB에서 하나의 단위로 취급되는 자료의 집합으로 테이블에서 가로 방향의 한 줄로 나타낸다. row라고도 하며, tuple이라고도 한다.
- Scan : DB의 실행계획에 자주 사용되는 용어로, DB의 특정 결과를 도출하기 위해 데이터에 접근하는 방법의 종류로 보면 되겠다.(ex. xxxx스캔 방식)
- Full tables scan : 테이블에 있는 모든 row들을 읽어내는 방법.
- RowId scan : 용어 그대로 Row의 Id를 통해 스캔하는 방법. 일반적으로 index를 경유하여 테이블을 접근하는 과정에서 발생한다.
- Index scan : 미리 정렬된 Index를 scan 하는 방식으로 실질적으로 많이 발생한느 방식이다.
- Index : Index란, B-Tree 기반의 혹은 Hash 기반으로 저장된 레코드들을 정렬하여 Sorted List의 형태로 보관한 주소 값들의 모음집 정도로 이해하면 될 것 같다.
마무리
이번 글에서는 개인적으로 서적을 읽으면서 잘 몰랐던 용어 위주로, 정의하였다. Scan의 경우, 실행계획 단계에서 굉장히 다양한 상황에서 다양한 방법으로 사용할 수 있는 요소로, 분명 용어 정리만 하고 넘어갈 부분은 아닌 것 같다. 일단은 이번 게시글은 이 정도로 마무리하고, 용어의 경우, 서적을 좀 더 읽으면서, 헷갈리는 부분이 생겼을 때, 그때 다시 업데이트하도록 하겠다.
'SQL' 카테고리의 다른 글
MySQL을 통해 SQL 파헤치기 -3- 인덱스 (0) | 2022.03.10 |
---|---|
MySQL을 통해 SQL 파헤치기 -2- 트랜잭션과 락 그리고 격리 수준 (0) | 2022.03.07 |
MySQL을 통해 SQL 파헤치기 -1- MySQL 엔진 아키텍처 (0) | 2022.03.06 |