SlideShare ist ein Scribd-Unternehmen logo
1 von 19
Downloaden Sie, um offline zu lesen
Real MySQL
Internal temporary table
•FROM 절의 서브 쿼리 -> 임시 테이블(Derived)
SELECT * FROM (
SELECT * FROM (
SELECT * FROM tab WHERE fd IN (1)
) x
) y;
+----+-------------+------------+
| id | select_type | table
|
+----+-------------+------------+
| 1 | PRIMARY
| <derived2> |
| 2 | DERIVED
| <derived3> |
| 3 | DERIVED
| tab
|
+----+-------------+------------+
Real MySQL

http://cafe.naver.com/realmysql
Internal temporary table
•사용된 임시 테이블 개수
mysql> SHOW STATUS LIKE 'Created_tmp_tables‘;
+-------------------------+-------+
| Created_tmp_tables
| 13
|
+-------------------------+-------+
mysql> SELECT * FROM (
SELECT * FROM (
SELECT * FROM tab where fd in (1)) x) y;
…
mysql> SHOW STATUS LIKE 'Created_tmp_tables‘;
+-------------------------+-------+
| Created_tmp_tables
| 15
|
+-------------------------+-------+
Real MySQL

http://cafe.naver.com/realmysql
Deterministic
• CREATE FUNCTION
CREATE
FUNCTION getCurrentTime() RETURN DATETIME
[ DETERMINISTIC | NOT DETERMINISTIC ]
BEGIN
DECLARE v_now DATETIME;
SELECT NOW() INTO v_now;
RETURN v_now;
END

Real MySQL

http://cafe.naver.com/realmysql
Deterministic
• 두 쿼리의 차이는 ?
SELECT *
FROM huge_table
WHERE expire_dttm > getCurrTime_DETERM ();
SELECT *
FROM huge_table
WHERE expire_dttm > getCurrTime_NOTDETERMIN ();
• SYSDATE()와 NOW() 함수의 차이는 ?
Real MySQL

http://cafe.naver.com/realmysql
Deterministic
• NOT-DETERMINISTIC Function
+----+-------------+----------+------+
| id | select_type | table
| type |
+----+-------------+----------+------+
| 1 | SIMPLE
| huge_tab | ALL |
+----+-------------+----------+------+

• SYSDATE()와 NOW() 함수의 차이는 ?

Real MySQL

http://cafe.naver.com/realmysql
IN (subquery)
•[NOT] IN (subquery)는 비효율적
•절대 subquery가 먼저 처리되지 못함
SELECT *
FROM tab outer
WHERE fd IN (SELECT fd FROM tab inner);
+----+--------------------+-------+
| id | select_type
| table |
+----+--------------------+-------+
| 1 | PRIMARY
| outer |
| 2 | DEPENDENT SUBQUERY | inner |
+----+--------------------+-------+

Real MySQL

http://cafe.naver.com/realmysql
IN (subquery)
•실행 계획의 의미
+----+--------------------+-------+
| id | select_type
| table |
+----+--------------------+-------+
| 1 | PRIMARY
| outer |
| 2 | DEPENDENT SUBQUERY | inner |
+----+--------------------+-------+
FOR (row1 IN outer){
exist( SELECT * FROM inner WHERE inner.fd=row1.fd )
}

Real MySQL

http://cafe.naver.com/realmysql
IN (subquery)
•IN (subquery)
Join이나 Derived 테이블
SELECT *
FROM tab outer, tab inner
WHERE outer.fd=inner.fd;

•NOT IN (subquery)
Anti-Join이나 Dervied를 이용한 Anti-Join
SELECT *
FROM tab outer
LEFT JOIN tab1 inner WHERE inner.fd=outer.fd
WHERE inner.fd IS NULL;
Real MySQL

http://cafe.naver.com/realmysql
IN (subquery)
•서브 쿼리에서 중복 제거 필요시
Derived 테이블 이용
SELECT [STRAIGHT_JOIN] *
FROM
(SELECT fd FROM tab inner GROUP BY …) x,
tab outer
WHERE outer.fd = x.fd

•서브 쿼리 내용 상수화
SELECT * FROM tab outer
WHERE outer.fd IN ( 1,2,3 )
Real MySQL

http://cafe.naver.com/realmysql
Transaction propagation
• A 데이터베이스의 트랜잭션에 외부 작업 개입
• 마스터와 슬레이브 DB 작업 혼재

BEGIN
UPDATE
SELECT
UPDATE
Commit

master_tbl SET … WHERE …
* FROM slave_tbl WHERE …
master_tbl SET … WHERE …
/ Rollback

Real MySQL

http://cafe.naver.com/realmysql
Transaction propagation
• DB 트랜잭션 중간에 외부 네트워크 작업
BEGIN
UPDATE tbl SET … WHERE …
Cassandra or HBase SET …
Send email or some other network job …
Commit / Rollback

Real MySQL

http://cafe.naver.com/realmysql
Transaction propagation
• 외부 작업 지연시
MySQL 서버의 레코드 잠금 시간 연장
• MySQL 서버의 Record 잠금 해제 지연 및
다른 세션의 잠금 대기 길어짐
• MySQL 서버는 큰 부하 없이, 아무런 작업도 처리 못함
• UndoRecord와 SystemTablespace ⇧
많은 Undo로 인한 SELECT 성능 ⇩

Real MySQL

http://cafe.naver.com/realmysql
Transaction propagation
• 트랜잭션 모니터링
mysql> SHOW ENGINE INNODB STATUS;
-----------TRANSACTIONS
-----------…
---TRANSACTION 3F0B, ACTIVE 23 sec, OS thread id 1252
1 lock struct(s), heap size 320, 0 row lock(s), undo log entries 1
MySQL thread id 1, query id 85 localhost 127.0.0.1 root
...

• Unix 계열 OS
mysql> pager grep ACTIVE
Real MySQL

http://cafe.naver.com/realmysql
한방 쿼리
SELECT
IFNULL(COUNT(fd1),0) as fd1, IFNULL(AVG(fd5),0) as fd4, IFNULL(fd6, 'Y') as fd5,
FROM (
SELECT fd1, fd2, 1 as fd3,
IF(fd4 <> fd6, 0,1) as fd4, IF(fd5 <> fd6, 1,0) as fd5, 0 as fd6 , 0 as fd7, fd8
FROM tab1 a
INNER JOIN tab2 b ON a.fd10 = b.fd10
WHERE b.fd13 IN (1, 2, 3, 4)
AND b.fd14 >= DATE_ADD('2011-10-08', INTERVAL 12 HOUR)
AND b.fd15 < DATE_ADD('2011-10-09', INTERVAL 12 HOUR)
GROUP BY fd1, fd2, fd3
UNION ALL
SELECT 0,0,0,0,0,1,0,a.fd1
FROM tab4 a
LEFT JOIN tab6 b ON a.fd1 = b.fd1
and b.fd11 < DATE_ADD('2013-10-08', INTERVAL 12 HOUR)
and b.fd12 in (12, 13)
WHERE a.fd13 IS NOT NULL
and a.fd15 IN (111,109)
…
…
…

Real MySQL

http://cafe.naver.com/realmysql
한방 쿼리
• 충분한 튜닝 능력과 집중력 필수
– 쿼리를 튜닝해줄 DBA가 있다면 OK
– 만약 튜닝 능력⇩ + DBA가 없다면
내게 익숙한 절차적 개발 언어 적극 활용

• 단순해질수록 고도의 튜닝 능력 불필요
• 잘게 샤딩된 MySQL -> 복잡한 쿼리 X
• 쿼리가 어떻게 작동할지 잘 모르겠다면,
컨트롤이 가능한 수준까지 쪼개에서 실행
Real MySQL

http://cafe.naver.com/realmysql
INDEX
• UNIQUE INDEX ?
• PRIMARY KEY 또는 UNIQUE INDEX로 Clustering
• Secondary Index는 PK 포함 (InnoDB)

• 인덱스 많을수록
INSERT UPDATE DELETE ⇩
SELECT 성능 ⇧

Real MySQL

http://cafe.naver.com/realmysql
INDEX
• 인덱스 중복과 중첩
INDEX (fd1, pk1) = INDEX (fd1)
UNIQUE INDEX (fd1) ⊃ INDEX (fd1)
INDEX (fd1, fd2) ≠ INDEX (fd2, fd1)
INDEX (pk1, fd1) ≠ INDEX (fd1, pk1)
INDEX (fd1, fd2) ⊂ INDEX (fd1, fd2, fd3)

Real MySQL

http://cafe.naver.com/realmysql
Real MySQL
QnA (http://cafe.naver.com/realmysql)

Real MySQL

http://cafe.naver.com/realmysql

Weitere ähnliche Inhalte

Was ist angesagt?

(SQL초보자를 위한, 쿼리최적화 for SQL튜닝)SQL쿼리작성Tip,최적화팁,최적화된SQL작성방법교육
(SQL초보자를 위한, 쿼리최적화 for SQL튜닝)SQL쿼리작성Tip,최적화팁,최적화된SQL작성방법교육(SQL초보자를 위한, 쿼리최적화 for SQL튜닝)SQL쿼리작성Tip,최적화팁,최적화된SQL작성방법교육
(SQL초보자를 위한, 쿼리최적화 for SQL튜닝)SQL쿼리작성Tip,최적화팁,최적화된SQL작성방법교육탑크리에듀(구로디지털단지역3번출구 2분거리)
 
효율적인Sql작성방법 2주차
효율적인Sql작성방법 2주차효율적인Sql작성방법 2주차
효율적인Sql작성방법 2주차희동 강
 
MySQL delete.update
MySQL delete.updateMySQL delete.update
MySQL delete.updateHoyoung Jung
 
[Pgday.Seoul 2020] SQL Tuning
[Pgday.Seoul 2020] SQL Tuning[Pgday.Seoul 2020] SQL Tuning
[Pgday.Seoul 2020] SQL TuningPgDay.Seoul
 
효율적인 SQL 작성방법 1주차
효율적인 SQL 작성방법 1주차효율적인 SQL 작성방법 1주차
효율적인 SQL 작성방법 1주차희동 강
 
효율적인Sql작성방법 3주차
효율적인Sql작성방법 3주차효율적인Sql작성방법 3주차
효율적인Sql작성방법 3주차희동 강
 
제6장조인과서브쿼리
제6장조인과서브쿼리제6장조인과서브쿼리
제6장조인과서브쿼리WooYeon Lee
 
파이썬 웹프로그래밍 1탄
파이썬 웹프로그래밍 1탄 파이썬 웹프로그래밍 1탄
파이썬 웹프로그래밍 1탄 SeongHyun Ahn
 
파이썬 데이터베이스 연결 2탄
파이썬 데이터베이스 연결 2탄파이썬 데이터베이스 연결 2탄
파이썬 데이터베이스 연결 2탄SeongHyun Ahn
 
#1.SQL초보에서 Schema Objects까지(SQL학원/오라클학원/IT실무교육학원/재직자/실업자교육학원추천)
#1.SQL초보에서 Schema Objects까지(SQL학원/오라클학원/IT실무교육학원/재직자/실업자교육학원추천)#1.SQL초보에서 Schema Objects까지(SQL학원/오라클학원/IT실무교육학원/재직자/실업자교육학원추천)
#1.SQL초보에서 Schema Objects까지(SQL학원/오라클학원/IT실무교육학원/재직자/실업자교육학원추천)탑크리에듀(구로디지털단지역3번출구 2분거리)
 
파이썬 데이터베이스 연결 1탄
파이썬 데이터베이스 연결 1탄파이썬 데이터베이스 연결 1탄
파이썬 데이터베이스 연결 1탄SeongHyun Ahn
 
파이썬 기본 문법
파이썬 기본 문법파이썬 기본 문법
파이썬 기본 문법SeongHyun Ahn
 
TABLE ACCESS 패턴을 이용한 SQL 튜닝_Wh oracle
TABLE ACCESS 패턴을 이용한 SQL 튜닝_Wh oracleTABLE ACCESS 패턴을 이용한 SQL 튜닝_Wh oracle
TABLE ACCESS 패턴을 이용한 SQL 튜닝_Wh oracle엑셈
 
효율적인Sql작성방법 4주차
효율적인Sql작성방법 4주차효율적인Sql작성방법 4주차
효율적인Sql작성방법 4주차희동 강
 
개발자들이 흔히 실수하는 SQL 7가지
개발자들이 흔히 실수하는 SQL 7가지개발자들이 흔히 실수하는 SQL 7가지
개발자들이 흔히 실수하는 SQL 7가지JungGeun Lee
 
[212]검색엔진dot의내부 강희구최규식
[212]검색엔진dot의내부 강희구최규식[212]검색엔진dot의내부 강희구최규식
[212]검색엔진dot의내부 강희구최규식NAVER D2
 
제8장 테이블 생성 수정 제거하기
제8장 테이블 생성 수정 제거하기제8장 테이블 생성 수정 제거하기
제8장 테이블 생성 수정 제거하기sang doc Lee
 

Was ist angesagt? (20)

MySQL JOIN
MySQL JOINMySQL JOIN
MySQL JOIN
 
(SQL초보자를 위한, 쿼리최적화 for SQL튜닝)SQL쿼리작성Tip,최적화팁,최적화된SQL작성방법교육
(SQL초보자를 위한, 쿼리최적화 for SQL튜닝)SQL쿼리작성Tip,최적화팁,최적화된SQL작성방법교육(SQL초보자를 위한, 쿼리최적화 for SQL튜닝)SQL쿼리작성Tip,최적화팁,최적화된SQL작성방법교육
(SQL초보자를 위한, 쿼리최적화 for SQL튜닝)SQL쿼리작성Tip,최적화팁,최적화된SQL작성방법교육
 
효율적인Sql작성방법 2주차
효율적인Sql작성방법 2주차효율적인Sql작성방법 2주차
효율적인Sql작성방법 2주차
 
MySQL delete.update
MySQL delete.updateMySQL delete.update
MySQL delete.update
 
[Pgday.Seoul 2020] SQL Tuning
[Pgday.Seoul 2020] SQL Tuning[Pgday.Seoul 2020] SQL Tuning
[Pgday.Seoul 2020] SQL Tuning
 
효율적인 SQL 작성방법 1주차
효율적인 SQL 작성방법 1주차효율적인 SQL 작성방법 1주차
효율적인 SQL 작성방법 1주차
 
효율적인Sql작성방법 3주차
효율적인Sql작성방법 3주차효율적인Sql작성방법 3주차
효율적인Sql작성방법 3주차
 
(오라클힌트/SQL튜닝 강좌)쿼리튜닝을 위한 오라클의 10053 이벤트
(오라클힌트/SQL튜닝 강좌)쿼리튜닝을 위한 오라클의 10053 이벤트(오라클힌트/SQL튜닝 강좌)쿼리튜닝을 위한 오라클의 10053 이벤트
(오라클힌트/SQL튜닝 강좌)쿼리튜닝을 위한 오라클의 10053 이벤트
 
제6장조인과서브쿼리
제6장조인과서브쿼리제6장조인과서브쿼리
제6장조인과서브쿼리
 
파이썬 웹프로그래밍 1탄
파이썬 웹프로그래밍 1탄 파이썬 웹프로그래밍 1탄
파이썬 웹프로그래밍 1탄
 
파이썬 데이터베이스 연결 2탄
파이썬 데이터베이스 연결 2탄파이썬 데이터베이스 연결 2탄
파이썬 데이터베이스 연결 2탄
 
#1.SQL초보에서 Schema Objects까지(SQL학원/오라클학원/IT실무교육학원/재직자/실업자교육학원추천)
#1.SQL초보에서 Schema Objects까지(SQL학원/오라클학원/IT실무교육학원/재직자/실업자교육학원추천)#1.SQL초보에서 Schema Objects까지(SQL학원/오라클학원/IT실무교육학원/재직자/실업자교육학원추천)
#1.SQL초보에서 Schema Objects까지(SQL학원/오라클학원/IT실무교육학원/재직자/실업자교육학원추천)
 
파이썬 데이터베이스 연결 1탄
파이썬 데이터베이스 연결 1탄파이썬 데이터베이스 연결 1탄
파이썬 데이터베이스 연결 1탄
 
파이썬 기본 문법
파이썬 기본 문법파이썬 기본 문법
파이썬 기본 문법
 
TABLE ACCESS 패턴을 이용한 SQL 튜닝_Wh oracle
TABLE ACCESS 패턴을 이용한 SQL 튜닝_Wh oracleTABLE ACCESS 패턴을 이용한 SQL 튜닝_Wh oracle
TABLE ACCESS 패턴을 이용한 SQL 튜닝_Wh oracle
 
효율적인Sql작성방법 4주차
효율적인Sql작성방법 4주차효율적인Sql작성방법 4주차
효율적인Sql작성방법 4주차
 
개발자들이 흔히 실수하는 SQL 7가지
개발자들이 흔히 실수하는 SQL 7가지개발자들이 흔히 실수하는 SQL 7가지
개발자들이 흔히 실수하는 SQL 7가지
 
[212]검색엔진dot의내부 강희구최규식
[212]검색엔진dot의내부 강희구최규식[212]검색엔진dot의내부 강희구최규식
[212]검색엔진dot의내부 강희구최규식
 
Perl Script
Perl ScriptPerl Script
Perl Script
 
제8장 테이블 생성 수정 제거하기
제8장 테이블 생성 수정 제거하기제8장 테이블 생성 수정 제거하기
제8장 테이블 생성 수정 제거하기
 

Andere mochten auch

[PHPFest 2013] High performance Javascript
[PHPFest 2013] High performance Javascript[PHPFest 2013] High performance Javascript
[PHPFest 2013] High performance Javascriptphpkorea
 
Systems engineering met Polarion
Systems engineering met PolarionSystems engineering met Polarion
Systems engineering met PolarionHarry Julsing
 
The Art of Project Management #13 일을 추진하는 방법
The Art of Project Management #13 일을 추진하는 방법The Art of Project Management #13 일을 추진하는 방법
The Art of Project Management #13 일을 추진하는 방법Jubok Kim
 
사람들이 착각하는 프로젝트 관리의 몇가지 개념
사람들이 착각하는 프로젝트 관리의 몇가지 개념사람들이 착각하는 프로젝트 관리의 몇가지 개념
사람들이 착각하는 프로젝트 관리의 몇가지 개념환성 용
 
Using JIRA Software for Issue Tracking
Using JIRA Software for Issue TrackingUsing JIRA Software for Issue Tracking
Using JIRA Software for Issue TrackingAnjali Rao
 
Introduction To Jira
Introduction To JiraIntroduction To Jira
Introduction To JiraHua Soon Sim
 
Introduction to JIRA & Agile Project Management
Introduction to JIRA & Agile Project ManagementIntroduction to JIRA & Agile Project Management
Introduction to JIRA & Agile Project ManagementDan Chuparkoff
 

Andere mochten auch (7)

[PHPFest 2013] High performance Javascript
[PHPFest 2013] High performance Javascript[PHPFest 2013] High performance Javascript
[PHPFest 2013] High performance Javascript
 
Systems engineering met Polarion
Systems engineering met PolarionSystems engineering met Polarion
Systems engineering met Polarion
 
The Art of Project Management #13 일을 추진하는 방법
The Art of Project Management #13 일을 추진하는 방법The Art of Project Management #13 일을 추진하는 방법
The Art of Project Management #13 일을 추진하는 방법
 
사람들이 착각하는 프로젝트 관리의 몇가지 개념
사람들이 착각하는 프로젝트 관리의 몇가지 개념사람들이 착각하는 프로젝트 관리의 몇가지 개념
사람들이 착각하는 프로젝트 관리의 몇가지 개념
 
Using JIRA Software for Issue Tracking
Using JIRA Software for Issue TrackingUsing JIRA Software for Issue Tracking
Using JIRA Software for Issue Tracking
 
Introduction To Jira
Introduction To JiraIntroduction To Jira
Introduction To Jira
 
Introduction to JIRA & Agile Project Management
Introduction to JIRA & Agile Project ManagementIntroduction to JIRA & Agile Project Management
Introduction to JIRA & Agile Project Management
 

Kürzlich hochgeladen

Console API (Kitworks Team Study 백혜인 발표자료)
Console API (Kitworks Team Study 백혜인 발표자료)Console API (Kitworks Team Study 백혜인 발표자료)
Console API (Kitworks Team Study 백혜인 발표자료)Wonjun Hwang
 
MOODv2 : Masked Image Modeling for Out-of-Distribution Detection
MOODv2 : Masked Image Modeling for Out-of-Distribution DetectionMOODv2 : Masked Image Modeling for Out-of-Distribution Detection
MOODv2 : Masked Image Modeling for Out-of-Distribution DetectionKim Daeun
 
A future that integrates LLMs and LAMs (Symposium)
A future that integrates LLMs and LAMs (Symposium)A future that integrates LLMs and LAMs (Symposium)
A future that integrates LLMs and LAMs (Symposium)Tae Young Lee
 
Merge (Kitworks Team Study 이성수 발표자료 240426)
Merge (Kitworks Team Study 이성수 발표자료 240426)Merge (Kitworks Team Study 이성수 발표자료 240426)
Merge (Kitworks Team Study 이성수 발표자료 240426)Wonjun Hwang
 
Continual Active Learning for Efficient Adaptation of Machine LearningModels ...
Continual Active Learning for Efficient Adaptation of Machine LearningModels ...Continual Active Learning for Efficient Adaptation of Machine LearningModels ...
Continual Active Learning for Efficient Adaptation of Machine LearningModels ...Kim Daeun
 
캐드앤그래픽스 2024년 5월호 목차
캐드앤그래픽스 2024년 5월호 목차캐드앤그래픽스 2024년 5월호 목차
캐드앤그래픽스 2024년 5월호 목차캐드앤그래픽스
 

Kürzlich hochgeladen (6)

Console API (Kitworks Team Study 백혜인 발표자료)
Console API (Kitworks Team Study 백혜인 발표자료)Console API (Kitworks Team Study 백혜인 발표자료)
Console API (Kitworks Team Study 백혜인 발표자료)
 
MOODv2 : Masked Image Modeling for Out-of-Distribution Detection
MOODv2 : Masked Image Modeling for Out-of-Distribution DetectionMOODv2 : Masked Image Modeling for Out-of-Distribution Detection
MOODv2 : Masked Image Modeling for Out-of-Distribution Detection
 
A future that integrates LLMs and LAMs (Symposium)
A future that integrates LLMs and LAMs (Symposium)A future that integrates LLMs and LAMs (Symposium)
A future that integrates LLMs and LAMs (Symposium)
 
Merge (Kitworks Team Study 이성수 발표자료 240426)
Merge (Kitworks Team Study 이성수 발표자료 240426)Merge (Kitworks Team Study 이성수 발표자료 240426)
Merge (Kitworks Team Study 이성수 발표자료 240426)
 
Continual Active Learning for Efficient Adaptation of Machine LearningModels ...
Continual Active Learning for Efficient Adaptation of Machine LearningModels ...Continual Active Learning for Efficient Adaptation of Machine LearningModels ...
Continual Active Learning for Efficient Adaptation of Machine LearningModels ...
 
캐드앤그래픽스 2024년 5월호 목차
캐드앤그래픽스 2024년 5월호 목차캐드앤그래픽스 2024년 5월호 목차
캐드앤그래픽스 2024년 5월호 목차
 

[PHPFest 2013] Real mysql

  • 2. Internal temporary table •FROM 절의 서브 쿼리 -> 임시 테이블(Derived) SELECT * FROM ( SELECT * FROM ( SELECT * FROM tab WHERE fd IN (1) ) x ) y; +----+-------------+------------+ | id | select_type | table | +----+-------------+------------+ | 1 | PRIMARY | <derived2> | | 2 | DERIVED | <derived3> | | 3 | DERIVED | tab | +----+-------------+------------+ Real MySQL http://cafe.naver.com/realmysql
  • 3. Internal temporary table •사용된 임시 테이블 개수 mysql> SHOW STATUS LIKE 'Created_tmp_tables‘; +-------------------------+-------+ | Created_tmp_tables | 13 | +-------------------------+-------+ mysql> SELECT * FROM ( SELECT * FROM ( SELECT * FROM tab where fd in (1)) x) y; … mysql> SHOW STATUS LIKE 'Created_tmp_tables‘; +-------------------------+-------+ | Created_tmp_tables | 15 | +-------------------------+-------+ Real MySQL http://cafe.naver.com/realmysql
  • 4. Deterministic • CREATE FUNCTION CREATE FUNCTION getCurrentTime() RETURN DATETIME [ DETERMINISTIC | NOT DETERMINISTIC ] BEGIN DECLARE v_now DATETIME; SELECT NOW() INTO v_now; RETURN v_now; END Real MySQL http://cafe.naver.com/realmysql
  • 5. Deterministic • 두 쿼리의 차이는 ? SELECT * FROM huge_table WHERE expire_dttm > getCurrTime_DETERM (); SELECT * FROM huge_table WHERE expire_dttm > getCurrTime_NOTDETERMIN (); • SYSDATE()와 NOW() 함수의 차이는 ? Real MySQL http://cafe.naver.com/realmysql
  • 6. Deterministic • NOT-DETERMINISTIC Function +----+-------------+----------+------+ | id | select_type | table | type | +----+-------------+----------+------+ | 1 | SIMPLE | huge_tab | ALL | +----+-------------+----------+------+ • SYSDATE()와 NOW() 함수의 차이는 ? Real MySQL http://cafe.naver.com/realmysql
  • 7. IN (subquery) •[NOT] IN (subquery)는 비효율적 •절대 subquery가 먼저 처리되지 못함 SELECT * FROM tab outer WHERE fd IN (SELECT fd FROM tab inner); +----+--------------------+-------+ | id | select_type | table | +----+--------------------+-------+ | 1 | PRIMARY | outer | | 2 | DEPENDENT SUBQUERY | inner | +----+--------------------+-------+ Real MySQL http://cafe.naver.com/realmysql
  • 8. IN (subquery) •실행 계획의 의미 +----+--------------------+-------+ | id | select_type | table | +----+--------------------+-------+ | 1 | PRIMARY | outer | | 2 | DEPENDENT SUBQUERY | inner | +----+--------------------+-------+ FOR (row1 IN outer){ exist( SELECT * FROM inner WHERE inner.fd=row1.fd ) } Real MySQL http://cafe.naver.com/realmysql
  • 9. IN (subquery) •IN (subquery) Join이나 Derived 테이블 SELECT * FROM tab outer, tab inner WHERE outer.fd=inner.fd; •NOT IN (subquery) Anti-Join이나 Dervied를 이용한 Anti-Join SELECT * FROM tab outer LEFT JOIN tab1 inner WHERE inner.fd=outer.fd WHERE inner.fd IS NULL; Real MySQL http://cafe.naver.com/realmysql
  • 10. IN (subquery) •서브 쿼리에서 중복 제거 필요시 Derived 테이블 이용 SELECT [STRAIGHT_JOIN] * FROM (SELECT fd FROM tab inner GROUP BY …) x, tab outer WHERE outer.fd = x.fd •서브 쿼리 내용 상수화 SELECT * FROM tab outer WHERE outer.fd IN ( 1,2,3 ) Real MySQL http://cafe.naver.com/realmysql
  • 11. Transaction propagation • A 데이터베이스의 트랜잭션에 외부 작업 개입 • 마스터와 슬레이브 DB 작업 혼재 BEGIN UPDATE SELECT UPDATE Commit master_tbl SET … WHERE … * FROM slave_tbl WHERE … master_tbl SET … WHERE … / Rollback Real MySQL http://cafe.naver.com/realmysql
  • 12. Transaction propagation • DB 트랜잭션 중간에 외부 네트워크 작업 BEGIN UPDATE tbl SET … WHERE … Cassandra or HBase SET … Send email or some other network job … Commit / Rollback Real MySQL http://cafe.naver.com/realmysql
  • 13. Transaction propagation • 외부 작업 지연시 MySQL 서버의 레코드 잠금 시간 연장 • MySQL 서버의 Record 잠금 해제 지연 및 다른 세션의 잠금 대기 길어짐 • MySQL 서버는 큰 부하 없이, 아무런 작업도 처리 못함 • UndoRecord와 SystemTablespace ⇧ 많은 Undo로 인한 SELECT 성능 ⇩ Real MySQL http://cafe.naver.com/realmysql
  • 14. Transaction propagation • 트랜잭션 모니터링 mysql> SHOW ENGINE INNODB STATUS; -----------TRANSACTIONS -----------… ---TRANSACTION 3F0B, ACTIVE 23 sec, OS thread id 1252 1 lock struct(s), heap size 320, 0 row lock(s), undo log entries 1 MySQL thread id 1, query id 85 localhost 127.0.0.1 root ... • Unix 계열 OS mysql> pager grep ACTIVE Real MySQL http://cafe.naver.com/realmysql
  • 15. 한방 쿼리 SELECT IFNULL(COUNT(fd1),0) as fd1, IFNULL(AVG(fd5),0) as fd4, IFNULL(fd6, 'Y') as fd5, FROM ( SELECT fd1, fd2, 1 as fd3, IF(fd4 <> fd6, 0,1) as fd4, IF(fd5 <> fd6, 1,0) as fd5, 0 as fd6 , 0 as fd7, fd8 FROM tab1 a INNER JOIN tab2 b ON a.fd10 = b.fd10 WHERE b.fd13 IN (1, 2, 3, 4) AND b.fd14 >= DATE_ADD('2011-10-08', INTERVAL 12 HOUR) AND b.fd15 < DATE_ADD('2011-10-09', INTERVAL 12 HOUR) GROUP BY fd1, fd2, fd3 UNION ALL SELECT 0,0,0,0,0,1,0,a.fd1 FROM tab4 a LEFT JOIN tab6 b ON a.fd1 = b.fd1 and b.fd11 < DATE_ADD('2013-10-08', INTERVAL 12 HOUR) and b.fd12 in (12, 13) WHERE a.fd13 IS NOT NULL and a.fd15 IN (111,109) … … … Real MySQL http://cafe.naver.com/realmysql
  • 16. 한방 쿼리 • 충분한 튜닝 능력과 집중력 필수 – 쿼리를 튜닝해줄 DBA가 있다면 OK – 만약 튜닝 능력⇩ + DBA가 없다면 내게 익숙한 절차적 개발 언어 적극 활용 • 단순해질수록 고도의 튜닝 능력 불필요 • 잘게 샤딩된 MySQL -> 복잡한 쿼리 X • 쿼리가 어떻게 작동할지 잘 모르겠다면, 컨트롤이 가능한 수준까지 쪼개에서 실행 Real MySQL http://cafe.naver.com/realmysql
  • 17. INDEX • UNIQUE INDEX ? • PRIMARY KEY 또는 UNIQUE INDEX로 Clustering • Secondary Index는 PK 포함 (InnoDB) • 인덱스 많을수록 INSERT UPDATE DELETE ⇩ SELECT 성능 ⇧ Real MySQL http://cafe.naver.com/realmysql
  • 18. INDEX • 인덱스 중복과 중첩 INDEX (fd1, pk1) = INDEX (fd1) UNIQUE INDEX (fd1) ⊃ INDEX (fd1) INDEX (fd1, fd2) ≠ INDEX (fd2, fd1) INDEX (pk1, fd1) ≠ INDEX (fd1, pk1) INDEX (fd1, fd2) ⊂ INDEX (fd1, fd2, fd3) Real MySQL http://cafe.naver.com/realmysql
  • 19. Real MySQL QnA (http://cafe.naver.com/realmysql) Real MySQL http://cafe.naver.com/realmysql