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 30998 게시물 읽기
No. 30998
left outer join 쿼리에 대해서 질문입니다.
작성자
이경보(rencca)
작성일
2016-10-12 13:34
조회수
3,637

SELECT
    s_id, s_name, s_name_eng, s_open_time, s_tel, s_comment_title, s_comment, s_charge_range, s_status ,
    g1.g_id AS g1_id, g1.g_name_eng AS g1_name_eng, g1.g_img_01 AS g1_img, g1.g_img_alt AS g1_alt ,
    g2.g_id AS g2_id, g2.g_name_eng AS g2_name_eng, g2.g_img_01 AS g2_img, g2.g_img_alt AS g2_alt ,
    g3.g_id AS g3_id, g3.g_name_eng AS g3_name_eng, g3.g_img_01 AS g3_img, g3.g_img_alt AS g3_alt ,
    (SELECT m_val FROM mst_option WHERE m_type = 'SHOP_TYPE' AND m_key = s_type) AS s_type_name ,
    (SELECT ad_name FROM mst_area_detail WHERE ad_id = s_area_detail_id) AS s_area_detail_name
FROM
    shop_info
LEFT OUTER JOIN
    girl_info g1 ON g1.g_s_id = s_id AND g1.g_rank = 1
LEFT OUTER JOIN
    girl_info g2 ON g2.g_s_id = s_id AND g2.g_rank = 2
LEFT OUTER JOIN
    girl_info g3 ON g3.g_s_id = s_id AND g3.g_rank = 3
WHERE 1 AND
    s_area_id = '101' AND s_start_ymd <= '2016-10-12' AND '2016-10-12' <= s_end_ymd
ORDER BY s_status DESC, s_update_date DESC LIMIT 0, 20

위와 같은 쿼리를 만들었는데 속도가 엄청 느려서 수정을 해야 할듯 한데 뭐가 문제 인지를 잘 모르겠습니다.

일단 left outer join 부분을 전부 없애면 빨리지는 것을 확인해서 left outer join쪽이 문제 인듯한데..

어떻게 수정하면 빨라질까요??

 

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

ORDER BY 부분범위로 LIMIT 부터 수행하고 조인하면 문제 없을 텐데
조인부터 수행한 뒤 전체범위로 ORDER BY, LIMIT 하는 모양이네요.
LIMIT 부터 수행하도록 변경해 보세요.


SELECT s_id, s_name, s_name_eng, s_open_time, s_tel, s_comment_title, s_comment, s_charge_range, s_status
     , g1.g_id AS g1_id, g1.g_name_eng AS g1_name_eng, g1.g_img_01 AS g1_img, g1.g_img_alt AS g1_alt
     , g2.g_id AS g2_id, g2.g_name_eng AS g2_name_eng, g2.g_img_01 AS g2_img, g2.g_img_alt AS g2_alt
     , g3.g_id AS g3_id, g3.g_name_eng AS g3_name_eng, g3.g_img_01 AS g3_img, g3.g_img_alt AS g3_alt
     , (SELECT m_val FROM mst_option WHERE m_type = 'SHOP_TYPE' AND m_key = s_type) AS s_type_name
     , (SELECT ad_name FROM mst_area_detail WHERE ad_id = s_area_detail_id) AS s_area_detail_name
  FROM (SELECT s_id, s_name, s_name_eng, s_open_time, s_tel, s_comment_title, s_comment, s_charge_range, s_status
             , s_type, s_area_detail_id
          FROM shop_info
         WHERE s_area_id = '101'
           AND s_start_ymd <= '2016-10-12'
           AND s_end_ymd   >= '2016-10-12'
         ORDER BY s_status DESC, s_update_date DESC
         LIMIT 0, 20
        ) s
  LEFT OUTER JOIN girl_info g1 ON g1.g_s_id = s_id AND g1.g_rank = 1
  LEFT OUTER JOIN girl_info g2 ON g2.g_s_id = s_id AND g2.g_rank = 2
  LEFT OUTER JOIN girl_info g3 ON g3.g_s_id = s_id AND g3.g_rank = 3
 ORDER BY s_status DESC, s_update_date DESC
;

마농(manon94)님이 2016-10-12 14:37에 작성한 댓글입니다.

감사합니다!
속도가 많이 줄긴 했는데
(기존 33초정도 -> 4초 정도)

left outer join이 1개 들어갈때 마다 1초씩 늘어나네요..;

기본 테이블 구성이 잘못이 된건지.....
조금더 고민을 해봐야 할듯네요!!

감사합니다!

 

이경보(rencca)님이 2016-10-13 11:24에 작성한 댓글입니다.

조인 때문에 느려진다면?
적절한 인덱스가 없다는 거죠.
 - girl_info(g_s_id, g_rank)
서브쿼리 쪽에도 인덱스가 적절한지 확인해 보세요.
 - mst_option(m_type, m_key)
 - mst_area_detail(ad_id)
메인쿼리도 확인
 - shop_info(s_area_id, s_end_ymd, s_start_ymd)

마농(manon94)님이 2016-10-13 11:49에 작성한 댓글입니다.
[Top]
No.
제목
작성자
작성일
조회
31002Lost connection to MySQL server at 'reading initial communication packet', system error: 111
이찬우
2016-11-03
3131
31001mysql rename 시 너무 느린 증상
박찬석
2016-10-31
3069
31000특정필드 값 소트.. [2]
이기자
2016-10-28
3074
30998left outer join 쿼리에 대해서 질문입니다. [3]
이경보
2016-10-12
3637
30997쿼리 부탁드립니다. [2]
바람
2016-10-12
3083
30996MyISAM -> InnoDB로 변경했는데 MyISAM으로 나오네요.ㅠㅠ
김동천
2016-10-10
3178
30995쿠폰 관련 테이블 모델링 질문 드립니다.!
bks
2016-10-10
2833
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2019 DSN, All rights reserved.
작업시간: 0.074초, 이곳 서비스는
	PostgreSQL v11.5로 자료를 관리합니다