암달의 법칙과 쿼리튜닝 기초

Preview:

Citation preview

데이터베이스 개론

기초튜닝

NHN NEXT 정호영

나눔고딕 및 나눔고딕코딩 글꼴을 설치해 주세요.

튜닝이란?

쿼리의 성능을 높이기 위한 방법

다양한 방법이 존재

암달의 저주 때문에 한계가 존재함

암달의저주(법칙)

시스템에서

차지하는 비율이 P인 구성요소의

성능을 S만큼 개선했을 때의 전체 성능 비율을 나타내는 공식

병렬 프로그래밍분야에서저주라고부르는이유

19.8배의한계에부딪힌다!

꼭 그런 건아닙니다.

암달의법칙이 주는교훈

성능을높이려면 시스템에서큰 비중을 차지하는쪽을높여라!

Ex)

5% 를 차지하는 A를 500% 성능개선

50%를 차지하는 B를 120% 성능개선?

암달의법칙이 주는교훈

성능을높이려면 시스템에서큰 비중을 차지하는쪽을높여라!

Ex)

1 / ((1-0.05) + 0.05/5) = 1.04 -> 4%개선

1/ ((1-0.7) + 0.7 / 1.2 ) = 1.13 -> 13%개선

암달의법칙이 주는교훈

인생에서도

무엇인가를개선하려면

조금 개선하더라도비율이 큰 쪽을개선하라.

데이터베이스쿼리의성능을높이는 방법

1. 더 비싼 하드웨어로 교체

2. 시스템 튜닝

3. 데이터 모델링을 통한 성능 개선

4. 쿼리 튜닝

하드웨어 + OS + 시스템 분야의 해박한 지식과 경험

현업에서튜닝이 절박한경우는

1. 성능이 좋은 걸 더 좋게 한다.

2. 알 수 없는 이유로 성능이 나빠졌을 때, 다시 원상복구

어디일까요?

원인을알아야 합니다.

1. 전문가를 초청한다 : 가장 좋지만 돈이 듭니다.

2. 정적분석 : 안 돌려 보고 원인을 예측하는 방법 DB는 쿼리플랜을 보는 좋은 툴이 있습니다.

3. 프로파일링 : 실제 실행 후, 실행결과를 분석하는 방법

MySQL에서 쿼리 플랜을 보려면

EXPLAIN명령을 사용합니다.

SELECT 문장에만사용할수 있습니다.

‘\G’ 를 사용하면 더 보기 좋게 나옵니다.

참고링크:

http://dev.mysql.com/doc/refman/5.5/en/explain-output.html

mysql> EXPLAIN SELECT … \G

결과는 하나 이상의 레코드 입니다.

한 행이 하나의 동작이고

대체로 위에서 아래로 실행됩니다.

ID는 SELECT당 하나씩 부여됩니다.

mysql> EXPLAIN SELECT * FROM USER;

mysql> EXPLAINSELECT * FROM USER JOIN TRADE ON USER.ID = TRADE.SELLER;

mysql> EXPLAINSELECT * FROM

(SELECT COUNT(*) FROM USER UNIONSELECT COUNT(*) FROM TRADE ) AS T;

SELECT_TYPE

SIMPLE, PRIMARY : 가장 바깥 쿼리

SUBQUERY : 일반 서브쿼리

mysql> EXPLAINSELECT * FROM USER

WHERE ID IN(SELECT SELLER FROM TRADE

GROUP BY SELLERHAVING COUNT(*) > 3);

SELECT_TYPE

DERIVED : FROM절의 서브 쿼리

*가능하면 없애자

m> EXPLAINSELECT * FROM ( SELECT * FROM user u) as u2;

SELECT_TYPE

DEPENDANT SUBQUERY : 바깥 테이블과 연관된 서브쿼리

*가능하면 없애자

m> EXPLAIN SELECT * FROM user uWHERE money > ANY (

SELECT price FROM trade t WHERE u.id = t.seller );

TABLE

테이블의 이름 또는 종류

<XX2>와 같은 테이블의 숫자는 쿼리 플랜의 ID를 가리킴

TYPE

실제 데이터를 읽는 방법

SYSTEM, CONST, REF, RANGE, INDEX, ALL 등이 있음

SYSTEM이 가장 빠르고 ALL 이 가장 느림

INDEX는 INDEX FULL SCAN, 빠르지않음

mysql> EXPLAIN SELECT * FROM USER WHERE LAST_VISIT > '2014-06-10';

mysql> CREATE INDEX TEST_IDX ON USER(LAST_VISIT);

mysql> EXPLAIN SELECT * FROM USER WHERE LAST_VISIT > '2014-06-1';

POSSIBLE KEYS

쓸모없는 컬럼, 가볍게 무시하자!

KEY

실제 데이터를 읽기 위해 사용되는 인덱스의 이름

필요에 의해 생성한 인덱스가 잘 사용되는지 확인!

mysql> DROP INDEX TEST_IDX ON USER;mysql> CREATE INDEX POPI ON USER(LAST_VISIT,MONEY);

mysql> EXPLAIN SELECT * FROM USER WHERE LAST_VISIT > '2014-06-01';

mysqL> EXPLAIN SELECT * FROM USER WHERE LAST_VISIT = '2014-06-01' AND MONEY > 1000;

mysql> EXPLAIN SELECT * FROM USER WHERE MONEY < 5000;

KEY_LEN

인덱스 중 사용할 수 있는 크기를 나타냅니다.

복합 인덱스에서 매우 중요합니다.

ROWS

예상 레코드 개수, 이를 위해 통계정보를 저장합니다.

EXTRA

이름과는 달리 매우 중요한 정보들이 저장되지만, 패스.

요약

1. 쿼리가 원하는 성능이 안 나올 경우 튜닝 실시

2. explain 명령으로 원인분석

3. dependant subquery, derived 와 같은 타입이 안 나오게

4. 되도록 all 이 나오지 않도록

THANK YOU!!!