728x90
반응형
SMALL

안녕하세요, 유튜브 데이터 모델링을 보고 학습한 자료를 남깁니다.

 

1. 관계형 데이터베이스의 기본 구성

MySQL, MaridDB, PostgreSQL과 같은 데이터베이스를 보고 관계형 데이터베이스라고 부른다.

관계형 데이터베이스는 여러 테이블로 구성된다.

테이블은 열(컬럼, Column)과 행(로우, Row)로 구성된다.

단어들을 들었을 때 바로 알아볼 수 있어야 한다.

 

감사합니다.

https://www.youtube.com/watch?v=lr5trEm_PXA&list=PLtUgHNmvcs6ooYsXgdlE80_QjGj8lg4YG&index=4

 

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

안녕하세요, 유튜브 데이터 모델링을 보고 학습한 자료를 남깁니다.

 

1. 데이터베이스 모델링(Database Modeling)이란?

데이터 모델링을 잘 하면, 

데이터를 검색하고, 입력/수정/삭제하기가 쉬워진다.

 

어떻게 설계할지가 데이터베이스 모델링이라고 이야기를 합니다.

 

2. 데이터베이스 모델링 방법을 왜 배워야 하나요?

옷을 정리를 잘 못하면

입고 싶을 때 해매게 된다.

데이터베이스도 마찬가지다.

데이터베이스 모델링을 위한 특정 규칙들이 있다. 이를 데이터베이스 모델링 방법이라고 한다.

데이터의 종류가 엄청 많습니다. 그래서 규칙성 없이 조금 데이터를 저장하면 찾지 못하고 헷갈리는 경우가 많다.

그래서 처음부터 분류를 잘 해야 한다.

 

감사합니다.

https://www.youtube.com/watch?v=NxQyWe2Fv_Q&list=PLtUgHNmvcs6ooYsXgdlE80_QjGj8lg4YG&index=8

 

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

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

감사합니다.

 

실습

테이블 생성을 하였다.

성능 소요시간을 확인해보니 499/ms 정도 된다.

created_at 컬럼에 인덱스를 생성하니 

소요시간이 167/ms로 단축되었다.

type을 통해 인덱스 레인지 스캔이 이루어진 것을 볼 수 있었다.

그리고 rows는 1,068 정도 조회된 것을 확인할 수 있다.

-> Filter: (users8.department = 'Sales')  (cost=1174.84 rows=107) (actual time=4.144..135.122 rows=108 loops=1)
    -> Index range scan on users8 using idx_created_at, with index condition: (users8.created_at >= <cache>((now() - interval 3 day)))  (cost=1174.84 rows=1067) (actual time=1.616..134.444 rows=1067 loops=1)

INDEX RANGE SCAN을 했는데 날짜 값의 조건을 만족하는 인덱스들 만을 가져온다. 1067행을 조회하였고 접근한 수 자체가 적다보니 134ms밖에 안 걸렸다.

이렇게 해당하는 값들을 가져오고 그 다음에 Filtering 작업을 거친다. 날짜 조건을 만족하는 데이터들 중에서 department='Sales' 인 값들을 가져온 것이다. rows=108이므로 총 108개의 데이터가 출력이 될 것이다.

속도가 왜 빨라졌어? 아 INDEX RANGE SCAN으로 딱 필요한 데이터에 대해서만 접근을 했기 때문에 속도가 빨라졌구나 추측을 할 수 있다.

이번에는 department 컬럼에 인덱스를 생성하고

조회를 해 보았다.

소요 시간이 2,157ms가 소요되는 것을 볼 수 있다.

-> Filter: (users8.created_at >= <cache>((now() - interval 3 day)))  (cost=15571.68 rows=63765) (actual time=23.752..2113.186 rows=106 loops=1)
    -> Index lookup on users8 using idx_department (department='Sales')  (cost=15571.68 rows=191314) (actual time=9.402..2092.389 rows=100000 loops=1)

옵티마이저가 두개의 인덱스 중 더 효율적인 인덱스를 골라서 INDEX RANGE SCAN을 적용하였다.

한 개의 인덱스만 사용을 하였다.

1,043rows를 확인했다.

따라서 중복 정도가 낮은 컬럼을 골라서 인덱스를 생성하라.

항상 실행 계획을 보면서 판단을 하면 좋다.

멀티 컬럼 인덱스

기존의 인덱스를 모두 지우고

인덱스의 순서를 created_at 그리고 department 순으로 만들었다.

SELECT 시 조회 성능이 매우 좋은 것을 볼 수 있다.

이번에는 인덱스 순서를 바꾸어서

department, created_at 순서로 멀티 컬럼 인덱스를 생성해보았다.

비슷한 성능을 내는 것을 볼 수 있다.

 

멀티 컬럼 인덱스 사용 시 소요 시간이나 created_at 컬럼에 인덱스를 활용시 소요 시간이나 비슷한 것을 볼 수 있다.

이런 경우 created_at 인덱스에만 인덱스를 사용을 하는 것이 좋다.

왜냐하면 인덱스를 최소한으로 거는 것이 더 중요하기 때문이다.

 

 

정말 감사합니다.

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

 

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

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

감사합니다.

 

최근 3일 이내에 가입한 유저 조회하기

테이블 생성 및 더미 데이터 입력

위 그림 대로 테이블을 생성하고

100만건의 더미 데이터를 입력하였다.

의미 있는 데이터를 입력하였다.

테스트를 해보겠다.

created_at 컬럼에 인덱스 생성 전에는 소요시간이 144/ms이다.

그런데 

인덱스를 생성하고 조회를 하면

30/ms로 조회되는 것을 확인할 수 있다.

인덱스 표를 참조해서 

특정 범위의 인덱스 값을 활용해서

데이터를 조회해 온 것이다.

rows 수 또한 기존의 약 100만건에서 1,000건으로 줄어든 것을 볼 수 있다.

Full Table Scan 그림

테이블의 모든 행을 조회하기 때문에 느릴 수 밖에 없다.

INDEX RANGE SCAN 그림

INDEX의 범위의 값을 활용해서 테이블의 값을 조회하는 것이다.

 

정말 감사합니다.

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

 

728x90
반응형
LIST
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

+ Recent posts