Web
[ Database - Intermediate ] - MySQL 구조 및 동작 흐름 (MySql 8.0 Architecture)
이번 포스팅은 MySQL에 대해 더욱 자세히 이해하고자, MySQL의 전체적인 아키텍처에 대해 조사해보는 시간을 가졌습니다. https://www.youtube.com/watch?v=vQFGBZemJLQ 위 우테코 강의를 참고했으니 참고하실 분은 해주시면 되겠습니다. MySQL 아키텍처 MySQL 접속 클라이언트 MySQL은 많은 언어에서 접속 클라이언트를 제공합니다. 그리고 쉘에서도 쉘 스크립트를 통해서도 MySQL에 접속할 수 있습니다. MySQL 엔진 클라이언트 접속과 SQL 요청을 처리합니다. 이는 쿼리 파서, 전처리기, 옵티마이저, 실행 엔진 등으로 이루어져 있습니다. 여기서 중요한 옵티마이저는 요청 SQL문을 최적화해서 실행시키기 위해 실행 계획을 짭니다. 이는 실제 쿼리 실행 과정을 살펴볼때..
[ Database - Intermediate ] - DBCP ( DB connection pool) + hikariCP, MySQL
이번에는 제가 Spring boot에서 JPA를 다루면서 DB connection도 하고, 트랜잭션 요청을 통해 DB 접근을 많이 했었는데, 이에 대한 DBCP가 hikariCP라는건 알고 있었습니다. 하지만 이에 대한 정확한 원리에 대해 잘 알고 있지 않고, 매개변수와 같은걸 설정할 때에 주의해야 할 점이 무엇이 있는지에 대해 알아보고자 간단히 정리해봅니다. 그리고 해당 포스팅에서는 백엔드 애플리케이션으로는 SpringBoot와 DBCP로는 HikariCP, DB 서버로는 MySQL을 기준으로 설명하겠습니다. HikariCP max_connections max_connections는 말 그대로 client와 맺을 수 있는 최대 connection의 수입니다. 이가 중요한 이유가 위 그림처럼 Backen..
[ Database - Intermediate ] - 파티셔닝, 샤딩, 래플리케이션
Partitioning 파티셔닝은 말 그대로 테이블을 자르는 작업이라고 보면 됩니다. 이에 대한 종류로는 위와같이 vertical, horizontal partitioning이 있습니다. 우선 vertical partitioning 먼저 보겠습니다. vertical partitioning 이는 그리 어렵지 않습니다. 우리가 쭉 해오던 BCNF와 같은 normalization이 결국에는 column을 기준으로 table을 나눈 것이 되므로 vertical partitioning이 됩니다. 하지만 이는 정규화만 있는 것이 아닙니다. 우리는 위와같이 Article에 대한 예시를 들 수 있겠습니다. 해당 테이블로부터 위 쿼리문을 통해 게시물들을 조회해올 겁니다. 하지만 실제로는 content 값이 필요 없어서 ..
[ Database - Intermediate ] - Index
SELECT * FROM customer WHERE first_name = "Minsoo'; (인덱스가 걸려있지 않은 상황)이런식으로 Customer 테이블을 full scan(=table scan)을 통해 tuple을 찾으면 $O(N)$의 시간 복잡도가 걸릴 것입니다. 그리고 Customer 테이블의 로우 수가 많아지면 많아질 수록 이는 비효율적인 scan이 되겠죠. 이는 B-tree based index를 적용해서 table scan을 하게되면 $O(logN)$으로 로우를 찾을 수 있습니다. 즉 해당 쿼리문이 더 빠르게 처리될 수 있습니다. 이는 상황에 따라서 조건을 만족하는 튜플(들)을 빠르게 조회하거나 바르게 정렬, 그룹핑하기 위해 사용됩니다. MySQL에서 Indexing 해보기 만약 위와같은 ..