쿼리문 조언 0 10 563

by 날아라! [MySQL] [2019.04.12 09:49:21]


안녕하세요. 데이터가 9만여개되는 게시판이 있습니다. 쿼리는 아래와 같습니다. 

select A.subject
     , A.content
     , A.wdate as wtime
     , from_unixtime(A.wdate, '%Y.%m.%d') as wdate
     , B.title
     , B.subject_len
     , B.down_point
     , B.point_msg
     , B.bbsadmin
     , B.newc
     , B.hotc
     , B.name_type
     , C.catname
     , C.caticon
     , D.purl
  from bbs as A
  left join bbsinfo as B
    on A.code = B.code
  left join bbscat as C
    on A.category = C.idx
  left join bbsmain as D
    on A.code = D.code
 order by A.idx

1. bbs : 게시판데이블

2. bbsinfo : 생성된 게시판정보 테이블

3. bbscat : 생성된 게시판의 카테고리항목을 관리하는 테이블

4. bbsmain : 홈페이지 메인에 노출되는 메인게시물 테이블

각 테이블별 인덱스는 잡혀있습니다.

explain을 걸어보면 실질적으로 bbs인덱스를 타지않고 Using filesort가 발생됩니다.

당연히 속도 또한 엄청느리구요.

제가 무엇인가를 놓치고 있긴 한것같은데 도통 어느곳에서 문제인지 알수가 없네요

어떤부분이 잘못된것인지 조언좀 부탁드립니다.

by 우리집아찌 [2019.04.12 10:29:06]

잘은 모르지만

전체 게시물을 전부 가져오시나요??

일부만 가져오시면 스칼라 서브 쿼리 한번 써보세요

위의 쿼리 그냥 쓰시려면 힌트 주셔야할겁니다.

 


by 우리집아찌 [2019.04.12 10:31:54]

straight_join 힌트 써서 해결한적은 있는데요

마이 sql은 잼별이라 ㅋㅋ


by 마농 [2019.04.12 10:55:23]

인덱스가 유용한 경우는 전체 자료중 일부자료를 검색할 때입니다.
아무런 조건이 없는 전체 자료 조회라면 풀스캔이 유리합니다.
그런데, 게시판이라면 페이징 처리를 해야 하지 않나요?


by 우리집아찌 [2019.04.12 11:01:35]

예측하기레응

정렬에 인덱스를 사용못해서 느린거 같아요

일단 선행태이블로 인댁스 타게해서 했는느ㄴ

 

페이징이라면 먼저 bbs 테이블 범위를 좁히고 조인해보세요


by 우리집아찌 [2019.04.12 11:05:32]

아 물론 idx 로 인덱스 안타면 그냥 idx에 힌트 걸러주세요셍

마리아디비 쓸때 인덱스가 한개씩밖에 안타서

아우터조인보다는 서브쿼리 많이 사용했어요

모바일 이라 오타많네요

아이폰은 에디터 버그있어요 ㅜㅜ


by 날아라! [2019.04.12 11:17:14]

아..죄송합니다. 제가 중요한 부분을 놓치고 질문을 드렸네요

select A.subject
     , A.content
     , A.wdate as wtime
     , from_unixtime(A.wdate, '%Y.%m.%d') as wdate
     , B.title
     , B.subject_len
     , B.down_point
     , B.point_msg
     , B.bbsadmin
     , B.newc
     , B.hotc
     , B.name_type
     , C.catname
     , C.caticon
     , D.purl
  from bbs as A
  left join bbsinfo as B
    on A.code = B.code
  left join bbscat as C
    on A.category = C.idx
  left join bbsmain as D
    on A.code = D.code
 where (A.subject like '%검색어%' or A.content like '%검색어%')
 order by A.idx

limit 0, 10
  
검색을 했을때 실행되는 쿼리이며 페이징처리가 되어있습니다. ㅡㅡ

질문 잘못올려 죄송합니다.


by 마농 [2019.04.12 11:21:20]

검색조건이 LIKE 검색인데다가 OR 조건이므로 인덱스를 이용할 수 없는 조건이네요.
검색조건 따로 정렬 기준 따로라 인덱스를 이용하기 힘든 상황이네요.
억지로 인덱스를 태우려 하지 마시고...
개선 가능한 부분은 다음과 같습니다.
 - 조인후 페이징 처리 --> 페이징 처리 후 조인


by 날아라! [2019.04.12 13:17:09]

답변감사합니다.

마농님의 말씀대로 시도해보았으나 데이터가 노출이 안되네요 ㅡㅡ

제가 잘못한것같은데요. 아래처럼 쿼리를 변경 시도해보았습니다.

잘못된 부분 지적부탁드립니다.

select A.subject
     , A.content
     , A.wdate as wtime
     , from_unixtime(A.wdate, '%Y.%m.%d') as wdate
     , B.title
     , B.subject_len
     , B.down_point
     , B.point_msg
     , B.bbsadmin
     , B.newc
     , B.hotc
     , B.name_type
     , C.catname
     , C.caticon
     , D.purl
  from ( 
    select *
      from bbs 
      order by idx
      limit 0, 10
  ) as A 
  left join bbsinfo as B
    on A.code = B.code
  left join bbscat as C
    on A.category = C.idx
  left join bbsmain as D
    on A.code = D.code
  where (concat(' ', A.subject, ' ') LIKE '% 검색어 %' or concat(' ', A.content, ' ') LIKE '% 검색어 %')


by 마농 [2019.04.12 13:26:46]

조건절이 인라인뷰 안으로 들어가야죠.
* 사용보다는 필요한 컬럼만 나열하세요.
like 보다는 instr 이 성능상 더 나을 듯 합니다.
정렬은 보통 DESC 로 하던데? ASC 정렬 맞나요?


by 마농 [2019.04.12 13:28:49]
SELECT a.subject
     , a.content
     , a.wdate AS wtime
     , from_unixtime(a.wdate, '%Y.%m.%d') AS wdate
     , b.title
     , b.subject_len
     , b.down_point
     , b.point_msg
     , b.bbsadmin
     , b.newc
     , b.hotc
     , b.name_type
     , c.catname
     , c.caticon
     , d.purl
  FROM (SELECT subject
             , content
             , wdate
             , code
             , category
             , idx
          FROM bbs
         WHERE (INSTR(subject, '검색어') > 0 OR INSTR(content, '검색어') > 0 )
         ORDER BY idx DESC
         LIMIT 0, 10
        ) a
  LEFT JOIN bbsinfo b
    ON a.code = b.code
  LEFT JOIN bbscat c
    ON a.category = c.idx
  LEFT JOIN bbsmain d
    ON a.code = d.code
;

 

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입