database.sarang.net
UserID
Passwd
Database
DBMS
ㆍMySQL
PostgreSQL
Firebird
Oracle
Informix
Sybase
MS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
MySQL Q&A 30295 게시물 읽기
No. 30295
mysql 서브쿼리 문제
작성자
이범진
작성일
2012-07-31 15:33
조회수
10,397

안녕하세요,

 

mysql에서 서브쿼리 사용 중 속도문제가 도무지 해결이 어려워 이렇게 질문 드리게 됐습니다.

 

그누보드 기반이라 우선 g4_member 테이블이 있구요,

 

회원정보 변경 이력을 기록하는 m_hist 테이블이 있습니다.

 

SELECT mb_id, mb_no, mb_name, mb_nick,

IF(
      ( ( SELECT h_changedate FROM m_hist WHERE mb_no = A.mb_no AND (h_history_type='1' OR h_history_type='2') ORDER BY seq DESC LIMIT 1 ) ) IS NULL ,

         mb_datetime,

         ( SELECT h_changedate FROM m_hist WHERE mb_no = A.mb_no AND (h_history_type='1' OR h_history_type='2') ORDER BY seq DESC LIMIT 1 )

) AS mb_datetime

FROM g4_member WHERE...

 

와 같이 사용중인데요, 속도가 엄청 느려지더군요...

 

쿼리 최적화를 좀 해야할것같은데, 구버전만 쓰다가 서브쿼리를 시작한지 얼마 안되어 막막하기만 합니다 ㅠㅠ

 

좋은 해결책이 있을까요?

 

미리 감사드립니다!!

이 글에 대한 댓글이 총 1건 있습니다.

현재의 쿼리 중, 서브쿼리에 포함된 조건인 mb_no, h_history_type, seq 에 대한 복합키가 m_hist에 없다면 매 g4_member ROW에 대해 느린 테이블 스캔이 발생할 것으로 보입니다.

 

쿼리를 아래와 같은 형태로 바꿔보시는 것은 어떨까요?

 

SELECT mb_id, g4.mb_no, mb_name, mb_nick, IF (MAX(h_changedate) IS NULL, mb_datetime, MAX(h_changedate) ) As mb_datetime

 

  FROM g4_member AS g4
  LEFT JOIN m_hist ON g4.mb_no = m_hist.mb_no AND h_history_type IN (1, 2)
  GROUP BY g4.mb_no;
 
 
sqlfiddle에 작성하셨던 쿼리와 제 쿼리를 비교한 예제를 만들어 두었으니 실행 계획을 열어 참고해보세요.

 

박현우(lqez)님이 2012-08-01 09:47에 작성한 댓글입니다.
이 댓글은 2012-08-01 09:52에 마지막으로 수정되었습니다.
[Top]
No.
제목
작성자
작성일
조회
30298oracle => Mysql 로 migration 시 체크 리스트 [2]
박상원
2012-08-01
13844
30297박현우님 질문있습니다. ^^ [2]
민족
2012-08-01
8509
30296innodb_flush_method 에 대해 알고 싶습니다. [1]
이제환
2012-07-31
9682
30295mysql 서브쿼리 문제 [1]
이범진
2012-07-31
10397
30293Mysql 인덱스 사용에 대해 궁금합니다. [2]
할로우
2012-07-30
9027
30292서버export 시킨 sql -> import 시킬때 에러 [1]
김양훈
2012-07-27
7684
30291Cardinality가 `none` 으로 나옵니다. [1]
정진섭
2012-07-26
8711
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.028초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다