일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- 기능별 구조
- 월간회고
- DeleteAll
- SQL 실행순서
- BalancedTree
- db
- 멀티쓰레드 프로그래밍
- useQuery
- 주간회고
- 도커
- 회고
- useMutation
- Jenkins
- 프리코스
- InnoDB 버퍼 풀
- ci/cd
- mysql
- 백기선 스터디
- Blue-Green
- 블로그 병행
- java
- N+1
- jacoco
- 클래스
- 계층별 구조
- B+TREE
- 우테코
- 어댑티브 해시 인덱스
- 메서드명
- 카카오 2차 코딩테스트
- Today
- Total
목록DB (6)
Haneul's Blog
프로그래머스에서 SQL 문제를 풀면서 쿼리문은 어떤 순서로 실행이 되는지에 대한 궁금증이 생겼습니다. 쿼리문도 당연히 프로그래밍 언어와 같이 실행되는 순서가 있고, 그 이유가 있을텐데 그러한 점을 생각하지 않고 쿼리문을 공부하니 학습 속도가 떨어지는 것 같아서 이에 대해 찾아보았습니다. 문법 순서와 실행 순서가 같은거 아니야? 라는 생각을 할 수 있는데 둘의 순서는 확연히 다르고, 둘의 차이점을 알아야 조금 더 좋은 쿼리문을 작성하는데 있어서 도움이 될 거라고 생각하고 아래에서 쿼리 문법 작성 순서와 실행 순서를 정리해보겠습니다. 문법 작성 순서 SELECT FROM WHERE GROUP BY HAVING ORDER BY 실행 순서 FROM ON JOIN WEHRE GROUP BY CUBE | ROLLU..

InnoDB 어댑티브 해시 인덱스를 알아보기 전에 MySQL에서 데이터를 접근할 때 사용하는 방법에 대해서 간단하게 설명하고 넘어가겠습니다. MySQL에서의 데이터 접근 방식 MySQL의 InnoDB 대표적인 인덱스는 B-Tree 자료구조를 사용합니다. 데이터는 Primary Key 순으로 정렬되어 관리되고, Secondrary Key는 인덱스키+PK 조합으로 정렬되어 있습니다. 특정 데이터를 찾기 위해서는 Secondrary Key에서 PK를 찾고, 그 PK를 통해 다시 원하는 데이터로 찾아가는 형태로 데이터가 처리됩니다. 트리의 가장 큰 강점은 데이터 접근 성능이 데이터가 증가하더라도 선형적으로 증가하지 않는다는 점입니다. 즉, 실제 데이터를 B-Tree 구조를 통해 찾을 때 Secondrary Ke..

InnoDB 버퍼 풀이란? InnoDB 버퍼 풀은 InnoDB 스토리지 엔진에서 가장 중요한 부분으로 디스크의 데이터 파일이나 인덱스 정보를 메모리에 캐시해두는 공간입니다. 데이터를 변경하는 쿼리는 데이터 파일 곳곳의 레코드를 변경하기 때문에 랜덤한 디스크 작업을 발생시키지만 버퍼 풀이 이러한 변경된 데이터를 모아서 처리하여 랜덤한 디스크 작업을 줄여주는 역할, 즉 쓰기 지연을 해줍니다. 또한 버퍼 풀은 대량 읽기 조작의 효율성을 위해 여러 행을 보유할 수 있는 페이지로 분할되며 캐리 관리 효율성을 위해링크된 페이지 목록으로 구현됩니다. 거의 사용되지 않는 데이터는 LRU 알고리즘을 사용하여 캐시에서 제거합니다. 이러한 버퍼 풀을 통해 데이터를 메모리에 유지하는 것은 MySQL 튜닝에서 핵심적인 측면입니..

MySQL에서 사용되는 메모리 공간은 크게 글로벌 메모리 영역과 로컬 메모리 영역이 있습니다. 글로벌 메모리 영역과 로컬 메모리 영역은 MySQL 서버 내에 존재하는 많은 스레드가 공유해서 사용하는 공간(글로벌 메모리)인지 아니면 각 스레드 별로 사용하는 공간(로컬 메모리)인지에 따라 나뉩니다. 글로벌 메모리 영역 글로벌 메모리 영역의 메모리 공간은 MySQL 서버가 시작되면서 운영체제로부터 할당되고, 이는 운영체제의 종류에 따라 할당해주는 방법이 다릅니다. 일반적으로 클라이언트 스레드의 수와 무관하게 하나의 메모리 공간만 할당되며, 필요에 따라 메모리 공간을 2개 이상 할당 받을 수 있지만 클라이언트의 스레드 수와는 무관합니다. 그리고 글로벌 영역은 앞에서 말했다시피 공유되는 공간이기 때문에 글로벌 영..

트랜잭션에는 ACID라는 특성이 있습니다. 이 중 D는 지속성을 의미하는데, 여기서 지속성이라는것은 트랜잭션 동작을 완료하고 완료 통지를 사용자가 받은 시점에서는 그 동작이 영속화(사라지지 않고 지속됌)되어 결과를 잃어버리지 않는 것을 의미합니다. 그래서 DB서버나, OS의 비정상적인 종료가 일어난다해도 그 전에 완료한 동작은 견딜 수 있다는 것입니다. 그렇다면 어떻게 지속성을 실현시킬 수 있는지 직관적으로 생각해보면 아래와 같이 생각할 수 있습니다. 데이터를 보존하는 기억장치인 하드디스크에 데이터 동기화 쓰기를 통해서 지속성을 유지하는 것입니다. 하지만 데이터베이스의 쓰기는 기억장치의 임의 장소에 무작위로 엑세스해서 쓰기를 수행하기 때문에 동기화 쓰기는 느려서 성능적인 면에서 별로라 쓰지 않습니다. 그..

MySQL을 공부하다가 문득 내부적으로는 어떻게 동작하고 있는지 궁금하여 공부하면서 정리해보려고 합니다. MySQL의 실행 구조는 위의 그림과 같다고 할 수 있는데, 서버쪽에서 SQL 요청이 들어오면 쿼리 파서 -> 전처리기 -> 옵티마이저 -> 쿼리 실행기를 거져서 스토리지 엔진으로 통해 실제 디스크에서 데이터를 가져오는 과정을 거칩니다. 각 부분별 역할은 아래 부분에 자세하게 설명하겠습니다. 쿼리파서 쿼리 파서는 사용자 요청으로 들어온 쿼리 문장을 토큰(MySQL이 인식할 수 있는 최소 단위의 어취나 기호)으로 분리하여 B-Tree 형태의 구조로 만드는 역할을 해주고, 기본 문법 오류의 발견 및 오류 메시지를 전달하는 역할도 합니다. 쉽게 정리하자면 SQL을 파싱하고 문법 오류를 검사하는 역할을 한다..