728x90
반응형
SMALL

안녕하세요, 유튜브 SQL 튜닝 강의를 보고 학습한 자료를 남깁니다.

감사합니다.

 

실습

데이터를 10000건 조회할시 소요 시간과

데이터를 10건 조회할시 소요 시간이 다르다.

데이터를 적게 조회했을 때 소요 시간이 더 적다.

데이터 조회를 최소한으로 할 필요가 있다.

실제 페이스북, 인스타그램의 서비스들도 모든 게시글을 한 번에 불러오지 않는다.

스크롤을 내려서 필요한 데이터를 그때 그때 로딩하는 방식이다.

또는 페이지네이션을 통해서 일부 데이터만 조회하려고 한다.

 

정말 감사합니다.

https://www.youtube.com/watch?v=WkDMTi3BYzA&list=PLtUgHNmvcs6rJBDOBnkDlmMFkLf-4XVl3&index=14

 

728x90
반응형
LIST
728x90
반응형
SMALL

안녕하세요, 유튜브 SQL 튜닝 강의를 보고 학습한 자료를 남깁니다.

감사합니다.

 

SQL 문의 '실행 계획' 사용해보기

옵티마이저는 SQL 요청이 들어오면

어떤 방식으로 어떻게 처리할지를 계획해요.

실행 계획을 통해서 이를 직접 알아볼 수 있다.

SQL 튜닝은 이 계획을 바꾸어주는 것이다.

 

옵티마이저 실행 계획 확인 방법

 

실행계획 타입

테이블은 PK를 기준으로 인덱스가 형성되어 있기 때문에

age 컬럼으로 조건절로 조회를 하면 

Full Table Scan을 하게 된다.

다음은 INDEX FULL SCAN을 통해서 데이터를 가져온 것이다.

FULL TABLE SCAN을 한 방법보다 

훨씬 더 빠르게 SELECT가 되는 것을 볼 수 있다.

UNIQUE가 아닌 경우라면 해당 컬럼에 데이터가 중복되어서 입력이 된다.

그래서 const가 출력될 수 없다.

중복되지 않은 컬럼에서 데이터 1건을 찾는 순간

나머지 데이터는 볼 필요가 없어진다. 훨씬 빠른 것이다.

성능 개선이 필요 없을 정도로 제일 좋다.

type이 const인 것을 볼 수 있다.

인덱스이기 때문에 한 번에 찾을 수 있는 것이다.

인덱스로 범위 형태의 데이터를 조회하는 것이다.

하지만 찾아야할 범위가 너무 크다면, 인덱스에서 찾아서 다시 실제 테이블에서 찾아야 하기 때문에

성능저하의 요인이 될 수 있다.

다음과 같이 인덱스를 갖은 컬럼을 기준으로 RANGE INDEX SCAN을 하였다.

EXPLAIN 명령어로 조회시 type에 range가 나오는 것을 볼 수 있다.

비고유 인덱스 스캔을 하는 것이다.

인덱스 표에 데이터들이 정렬되어 있기 때문이다.

type에 ref가 나오는 것을 볼 수 있다.

비고유 인덱스로 데이터를 찾았다.

이외에도 type들이 많다.

eq_ref, index_merge, ref_or_nul 등이 있다.

 

정말 감사합니다.

https://www.youtube.com/watch?v=4a747XKKkkw&list=PLtUgHNmvcs6rJBDOBnkDlmMFkLf-4XVl3&index=11

 

728x90
반응형
LIST
728x90
반응형
SMALL

안녕하세요, 유튜브 SQL 튜닝 강의를 보고 복습한 자료를 남깁니다.

감사합니다.

 

1. PK 인덱스 효과 (클러스터형 인덱스)

PRIMARY KEY인 컬럼은 클러스터형 인덱스가 자동으로 생성된다.

테이블이 PRIMARY KEY 컬럼을 기준으로 정렬된다.

그래서 SELECT시 성능이 빠르다.

 

2. UNIQUE 인덱스 효과 (보조 인덱스)

UNIQUE 컬럼은 보조 인덱스가 생성된다.

테이블은 정렬되지 않지만

책의 찾아보기와 같은 역할을 수행한다.

SELECT 시 성능이 빠르다.

클러스터형 인덱스가 더 빠르다.

조회하는 페이지가 더 적기 때문이다.

users 테이블은 PRIMARY 인덱스만 있고,

users2 테이블은 PRIMARY 인덱스와 UNIQUE 인덱스 이렇게 2개가 있다.

용량의 차이가 users 테이블은 16K

users2 테이블은 32K 인 것을 확인할 수 있다.

 

감사합니다.

#1

https://www.youtube.com/watch?v=QilztrTTMCw&list=PLtUgHNmvcs6rJBDOBnkDlmMFkLf-4XVl3&index=8

 

#2

https://www.youtube.com/watch?v=P0f0uB9tCYM&list=PLtUgHNmvcs6rJBDOBnkDlmMFkLf-4XVl3&index=9

 

 

728x90
반응형
LIST
728x90
반응형
SMALL

안녕하세요, 유튜브 SQL 튜닝 강의를 보고 학습한 자료를 남깁니다.

감사합니다.

 

인덱스 직접 설정해보기

그림에 맞도록 데이터베이스와 users 테이블을 생성해보았다.

그리고 더미 데이터를 100만건 생성하였다.

유튜버의 코드를 공유한다.

재귀 횟수를 100만건 선언한다.

그리고 cte라는 임시 테이블을 생성하고 

cte 임시 테이블안에 100만건의 데이터를 적재한다.

그리고 그 임시 테이블에서 

n을 조회해서 id를 만들고, 1부터 1000까지의 랜덤값을 age로 만들어서 조회한다.

그리고 그 조회된 데이터들을 users 테이블의 id와 age 컬럼에 맞게 INSERT한다.

이렇게 100만건의 더미 데이터를 만들었다.

그리고 조회를 한다.

나이가 23세인 회원만 조회를 하였는데, 소요시간이 약 345(ms) 정도가 소요된다.

나이 컬럼에 인덱스를 생성하고 

다시 23세인 회원을 조회를 하니 소요 시간이 159(ms) 정도 소요되었다.

그 이유는

나이 컬럼에 인덱스를 생성하여

속도가 빨라진 것이다.

인덱스를 생성하면 위 그림과 같이 정렬된 나이 인덱스 표를 기준으로 데이터를 조회하기 때문이다.

 

정말, 감사합니다.

https://www.youtube.com/watch?v=VI30oDxOlGU&list=PLtUgHNmvcs6rJBDOBnkDlmMFkLf-4XVl3&index=7

 

728x90
반응형
LIST
728x90
반응형
SMALL

안녕하세요, 유튜브 SQL 튜닝 강의를 보고 학습한 자료를 남깁니다.

감사합니다.

 

인덱스(Index)란?

데이터베이스 테이블에 대한 검색 성능의 속도를 높여주는 자료 구조를 뜻한다.

데이터를 빨리 찾기 위해 특정 컬럼을 기준으로 미리 정렬해놓은 표

 

예시를 통해 인덱스의 의미를 직관적으로 이해해보자.

만일 데이터가 섞여 있다면, Full Table Scan을 해야 한다.

시간이 오래걸릴 수 밖에 없다.

그래서 인덱스를 사용해서 해결할 수 있다.

미리 정렬되어 있는 시스템 내부적인 표가 있다면

쉽게 조회가 가능하다.

 

정말 감사합니다.

https://www.youtube.com/watch?v=VvYh8HBM0A8&list=PLtUgHNmvcs6rJBDOBnkDlmMFkLf-4XVl3&index=6

 

728x90
반응형
LIST
728x90
반응형
SMALL

안녕하세요, 유튜브 SQL 튜닝 강의를 보고 학습한 자료를 남깁니다.

감사합니다.

 

들어가면서

성능 개선을 위해서 MySQL 구조 먼저 파악하겠습니다.

그리고 SQL 튜닝의 핵심이 무엇인지 짚고 넘어갈 것이다.

-> 어떤 부분에서 MySQL의 성능을 많이 잡아 먹는지, 어떤 요인이 주로 문제를 일으키는지 파악할 수 있어야 한다.

 

MySQL의 아키텍처

MySQL이라는 서버가 있고

그 안에 MySQL엔진이라는 공간이 있고

스토리지 엔진이라는 공간이 있다.

 

과정을 알아보자.

1. 클라이언트가 DB에 SQL 요청을 보낸다.

2. MySQL 엔진에서 성능 최적화를 해주는 옵티마이저가 먼저 SQL문을 분석한다. 

아 이런 이런 데이터를 가져오는구나 그래서 어떻게 데이터를 가져오면 더 빠르겠다 이렇게 판단을 한 뒤 계획을 세운다.

그 계획에는 어떤 순서로 어떻게 테이블에 접근할지, 인덱스를 사용할지, 어떤 인덱스를 사용할 지 등을 결정한다.

하지만 옵티마이저가 세운 계획은 완벽하지는 않다. 그래서 SQL 튜닝이 필요하다. 옵티마이저가 잘 알아 듣을 수 있도록 튜닝이 필요하다.

3. 옵티마이저가 세운 계획을 바탕으로 스토리지 엔진에서 데이터를 가져온다.

옵티마이저가 세운 계획대로 스토리지 엔진에 데이터가 있는데, 이 데이터를 가져온다.

DB 성능에 문제가 생기는 원인의 대부분은 스토리지 엔진으로부터 데이터를 가져올 때 발생이 된다. 

데이터를 찾기가 어려워서 오래 걸리거나, 가져올 데이터가 너무 많아서 오래 걸린다.

SQL 튜닝의 핵심은 스토리지 엔진으로부터 되도록이면 데이터를 찾기 쉽게 바꾸고, 적은 데이터를 가져오도록 바꾸는 것을 말한다.

4. MySQL 엔진에서 정렬, 필터링 등의 마지막 처리를 한 뒤에 클라이언트에게 SQL 결과를 응답한다.

스토리지 엔진에서 가져온 데이터를 MySQL 엔진에서 정렬을 진행하고, 필터링을 진행하는 여러 처리를 거친 다음에 

클라이언트에게 SQL 결과를 응답합니다.

 

SQL 튜닝의 핵심

SQL 튜닝이란 옵티마이저의 실행 계획이 완벽하지 않다. 그래서 우리가 튜닝하는 것을 SQL 튜닝이라고 한다.

이 데이터를 얼마나 쉽게, 적은 데이터를 효율적으로 가져오게 할 것인지가 핵심이다.

 

1. 스토리지 엔진에서 데이터를 찾기 쉽게 바꾸기

2. 스토리지 엔진으로부터 가져오는 데이터의 양 줄이기

 

가장 많이 활용되는 방법은 바로 인덱스의 활용이다.

인덱스를 적절하게 사용해야만 DB 성능이 개선이 된다.

 

정말 감사합니다.

https://www.youtube.com/watch?v=VVszO0lktE4&list=PLtUgHNmvcs6rJBDOBnkDlmMFkLf-4XVl3&index=5

 

728x90
반응형
LIST
728x90
반응형
SMALL

안녕하세요, 유튜브 SQL 튜닝 강의를 보고 학습한 자료를 남깁니다.

감사합니다.

 

DB 성능 방법들의 예시

- SQL 튜닝

-  캐싱 서버 활용 (Redis 등)

-  레플리케이션 (Master/Slave 구조)

-  샤딩

-  스케일업 (CPU, Memory, SSD 등 하드웨어 업그레이드)

 

SQL 튜닝을 가장 먼저 고려해야 하는 이유

1. 추가적인 시스템을 구축해야 한다.

SQL 튜닝을 제외한 다른 방법들은 추가적인 시스템을 구축해야 한다.

금전적, 시간적 그리고 관리적 비용이 증가한다.

단순히 하나의 서버만 아니라 여러 대의 서버를 동시에 관리하고 모니터링하는 것에 있어서 비용이 커진다.

근데 그에 비해 SQL 튜닝은 기존의 시스템 변경없이 성능 개선을 할 수 있다.

 

2. 근본적인 문제를 해결하는 방법이 SQL 튜닝일 가능성이 높다.

SQL 자체가 비효율적으로 작성했다면 아무리 시스템적으로 성능을 개선한다고 하더라도 한계가 있다.

하지만 SQL 튜닝을 통해 기본적으로 성능을 향상시킨다면, 시스템적인 성능 개선이 필요없거나 훨씬 간단한 개선으로 큰 성능 개선 효과를 얻을 수 있다.

 

정말 감사합니다.

https://www.youtube.com/watch?v=vbatA68GL1I&list=PLtUgHNmvcs6rJBDOBnkDlmMFkLf-4XVl3&index=4

 

728x90
반응형
LIST
728x90
반응형
SMALL

안녕하세요, 유튜브 SQL 튜닝 강의를 보고 학습한 자료를 남깁니다.

감사합니다.

 

DB의 성능 저하 요인

1. 동시 사용자 수의 증가

2. 데이터 양의 증가

3. 비효율적인 SQL문 작성

 

DB가 느릴 시 사용자의 서비스 이탈

DB 성능이 느려졌다면 서비스를 사용할 때 가장 먼저 체감할 수 있다. 실제 서비스를 사용하다보면 데이터 자체가 늦게 로딩되는 것을 볼 수 있다. 서비스를 사용하는 입장에서 조금만 답답하다고 느껴지면 바로 이탈하게 되고, 사용자 이탈은 회사의 큰 손실로 이어지게 된다.

그러다보니 개발자 기술 면접에서 DB 성능 개선시 필요한 기초 개념(인덱스, 실행 계획 등)과 DB 성능 개선 경험을 자주 물어보는 추세이다.

최근 많은 IT 서비스 기업의 회사 트렌드는

백엔드 개발자는 DB를 설계하는 것부터 성능 개선까지 기본 소양으로 여겨지고 있다. 경쟁력있는 개발자가 되려면 DB 성능 개선에 관련된 개념을 배우고, DB 성능 개선 경험을 쌓을 필요가 있다.

 

정말 감사합니다.

https://www.youtube.com/watch?v=P_mINkH4zGg&list=PLtUgHNmvcs6rJBDOBnkDlmMFkLf-4XVl3&index=3

 

728x90
반응형
LIST

+ Recent posts