리스트 쿼리 속도에 관하여 질문 드립니다.

리스트 쿼리 속도에 관하여 질문 드립니다.

QA

리스트 쿼리 속도에 관하여 질문 드립니다.

본문

게시판 하나에 문서가 30만개 정도일때는 차이를 심하게 못느꼈는데

 

게시물이 400만개 정도 되니까 차이가나는 부분이 있어서 질문을 드립니다.

 

 

 

환경은 우분투.아파치.mysql 이구요

 

게시물이 아주 많을때...  (지금 문제가 발생하는 게시판들은 게시글이 100만~ 400만개 정도입니다. )

 

리스트 출력에 속도가 엄청 느려지는 경우가 있는데요...

 

한페이지에 20개씩 출력되는 목록을 뽑는데 4초씩 걸리고 그럽니다.

 

그런데 이게 느려지는 조건을 따져보니

 

카테고리와 관련이 있는 것 같습니다.

 

sca 값 없이 전체 리스트를 뽑으면 4초씩 걸리고

 

sca 값이 있으면  리스트 뽑으면 바로바로 뜹니다.

 

991445703_1555956611.304.png

 

이렇게 카테고리가 되어 있는데...

 

전체 놓고 페이지를 누르면 4초씩 걸리지만

 

다른 카테고리를 선택하고 페이지를 누르면 바로 뜬다는  말입니다.

 

 

왜 이런 현상이 생기는지

 

찾아보는 중입니다.

 

 

 

이런 문제를 겪어보신분 계시면 

 

의견 부탁 드릴게요...

 

꾸벅..

이 질문에 댓글 쓰기 :

답변 6

WHERE 이하에 적용되는 내용중

가장 가변적이지 않은 항목(필드)의 이름을

엮어서 index를 지정하시고

 

카테고리등 연결되는 부분이나

간헐적검색은 개별 index를 걸어두시면 개선이 있을겁니다.

 

참고

https://d2.naver.com/helloworld/1155

https://sir.kr/qa/56832   sca가 카테고리 맞네요..  전체가 400만개이고

보여지는 카테고리가 7개라고 하면 한 카테고리 60만개정도 되니 빠르게 나올 것 같습니다.

그누보드 게시판 테이블의 인덱스가 데이타가 많은 경우에 맞춰서 설계되어 있지 않습니다.

따라서 게시물이 많으면, 실행되는 쿼리에 맞춰서 인덱스를 조정해야 합니다.

슬로우 쿼리 중심으로 explain을 보신다음 인덱스를 추가하세요.

 

 

list.php 에 보면

 

$sql_search .= " and (wr_num between {$spt} and ({$spt} + {$config['cf_search_part']})) ";

이부분이 있어요 

몇번부터 몇번 사이에 몇개를 가져온다는건데..

이걸 쿼리문에 넣어주면 됩니다. 

귀찮으니 그냥 아래처럼 

 

--------------

if ($is_search_bbs) {
    $sql = " select distinct wr_parent from {$write_table} where {$sql_search} {$sql_order} limit {$from_record}, $page_rows ";
} else {
    $sql = " select * from {$write_table} where wr_is_comment = 0 ";
    if(!empty($notice_array))
        $sql .= " and wr_id not in (".implode(', ', $notice_array).") ";
    $sql .= " {$sql_order} limit {$from_record}, $page_rows ";
}

 

=======이거를 아래처럼 =========

 

if ($is_search_bbs) {
    $sql = " select distinct wr_parent from {$write_table} where {$sql_search} {$sql_order} limit {$from_record}, $page_rows ";
} else {
    $sql = " select * from {$write_table} where wr_is_comment = 0 {$sql_search}  ";
    if(!empty($notice_array))
        $sql .= " and wr_id not in (".implode(', ', $notice_array).") ";
    $sql .= " {$sql_order} limit {$from_record}, $page_rows ";
}

 

----------

 

쿼리 부분을 이렇게만 바꿔도 될겁니다.

 

 

 

대충 보니까

전체 목록은 전체 테이블에 대해서 쿼리를 하고

카테고리 목록은 지정한 갯수에 대해서 쿼리를하는 이유로 (검색과 동일)

속도의 차이가 발생하고 있었네요

 

where ~~ and (wr_num between -4000129 and (-4000129 + 50000))    <== 이 부분이 차이를 만들고 있었습니다.

 

전체목록에도 이것을 적용시키면 문제가 해결 될 듯 싶습니다.

전체 목록에도 검색이나 카테고리와 마찬가지로 몇페이지 누르고나면

다음목록 버튼 나오도록 만들면 해결되겠네요.

 

페이징 함수랑 리스트 부분을 수정하면 될 듯 하네요..

문서 검색  갯수를 10만개 정도 주고  페이징호출해봤는데

빠릿빠릿하게 돌아갑니다.

부하를 고려해서 5천개 정도 주고 써야겠네요

 

 

생각했던 대로  일반 게시판에 검색갯수 적용하는 부분을 끼워 넣어서  해보니까

 

속도가 빨라졌습니다.

 

이게 기본으로 적용되있으면 좋겠네요...

답변을 작성하시기 전에 로그인 해주세요.
전체 36
QA 내용 검색

회원로그인

(주)에스아이알소프트 / 대표:홍석명 / (06211) 서울특별시 강남구 역삼동 707-34 한신인터밸리24 서관 1404호 / E-Mail: admin@sir.kr
사업자등록번호: 217-81-36347 / 통신판매업신고번호:2014-서울강남-02098호 / 개인정보보호책임자:김민섭(minsup@sir.kr)
© SIRSOFT