4. 병렬 프로그래밍 분야에서 저주라고 부르는 이유
19.8배의 한계에 부딪힌다!
꼭 그런 건 아닙니다.
5. 암달의 법칙이 주는 교훈
성능을 높이려면 시스템에서 큰 비중을 차지하는 쪽을 높여라!
Ex)
5% 를 차지하는 A를 500% 성능개선
50%를 차지하는 B를 120% 성능개선?
6. 암달의 법칙이 주는 교훈
성능을 높이려면 시스템에서 큰 비중을 차지하는 쪽을 높여라!
Ex)
1 / ((1-0.05) + 0.05/5) = 1.04 -> 4%개선
1/ ((1-0.7) + 0.7 / 1.2 ) = 1.13 -> 13%개선
7. 암달의 법칙이 주는 교훈
인생에서도
무엇인가를 개선하려면
조금 개선하더라도 비율이 큰 쪽을 개선하라.
8. 데이터베이스 쿼리의 성능을 높이는 방법
1. 더 비싼 하드웨어로 교체
2. 시스템 튜닝
3. 데이터 모델링을 통한 성능 개선
4. 쿼리 튜닝
하드웨어 + OS + 시스템 분야의 해박한 지식과 경험
9. 현업에서 튜닝이 절박한 경우는
1. 성능이 좋은 걸 더 좋게 한다.
2. 알 수 없는 이유로 성능이 나빠졌을 때, 다시 원상복구
어디일까요?
10. 원인을 알아야 합니다.
1. 전문가를 초청한다 : 가장 좋지만 돈이 듭니다.
2. 정적분석 : 안 돌려 보고 원인을 예측하는 방법 DB는 쿼리
플랜을 보는 좋은 툴이 있습니다.
3. 프로파일링 : 실제 실행 후, 실행결과를 분석하는 방법
11. MySQL에서 쿼리 플랜을 보려면
EXPLAIN명령을 사용합니다.
SELECT 문장에만 사용할 수 있습니다.
‘G’ 를 사용하면 더 보기 좋게 나옵니다.
참고링크:
http://dev.mysql.com/doc/refman/5.5/en/explain-
output.html
mysql> EXPLAIN SELECT … G
12. 결과는 하나 이상의 레코드 입니다.
한 행이 하나의 동작이고
대체로 위에서 아래로 실행됩니다.
13. ID는 SELECT당 하나씩 부여됩니다.
mysql> EXPLAIN
SELECT * FROM USER;
mysql> EXPLAIN
SELECT * FROM USER JOIN TRADE ON USER.ID = TRADE.SELLER;
14. mysql> EXPLAIN
SELECT * FROM
(SELECT COUNT(*) FROM USER
UNION
SELECT COUNT(*) FROM TRADE ) AS T;
15. SELECT_TYPE
SIMPLE, PRIMARY : 가장 바깥 쿼리
SUBQUERY : 일반 서브쿼리
mysql> EXPLAIN
SELECT * FROM USER
WHERE ID IN
(SELECT SELLER FROM TRADE
GROUP BY SELLER
HAVING COUNT(*) > 3);
17. SELECT_TYPE
DEPENDANT SUBQUERY : 바깥 테이블과 연관된 서브쿼리
*가능하면 없애자
m> EXPLAIN
SELECT * FROM user u
WHERE money > ANY (
SELECT price FROM trade t WHERE u.id = t.seller );
19. TYPE
실제 데이터를 읽는 방법
SYSTEM, CONST, REF, RANGE, INDEX, ALL 등이 있음
SYSTEM이 가장 빠르고 ALL 이 가장 느림
INDEX는 INDEX FULL SCAN, 빠르지 않음
20. 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';
21. POSSIBLE KEYS
쓸모없는 컬럼, 가볍게 무시하자!
KEY
실제 데이터를 읽기 위해 사용되는 인덱스의 이름
필요에 의해 생성한 인덱스가 잘 사용되는지 확인!
22. 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;
23. KEY_LEN
인덱스 중 사용할 수 있는 크기를 나타냅니다.
복합 인덱스에서 매우 중요합니다.
ROWS
예상 레코드 개수, 이를 위해 통계정보를 저장합니다.