포럼

하나의 게시판에 게시물 10만개 올려두면 mysql의 cpu사용양이 클릭때 마다 40%가까이 가네요,

cpu는 q8400입니다, 최고라고 할순 없지만 상위입니다.

 

이 문제를 지금까지 1년 6개월간 해결법을 찾고 있는중입니다,

 

일단 apache+mysql+php로 돌리는데 mysql에 초짜라 원인 및 해결법을 찾는데 많이 힘들었습니다,

초당 8회정도의 페이지뷰가 생기는데 게시판당 10만개 게시물을 넣을시 방문이 불가능하더군요,

cpu는 100%

 

조금씩 게시물을 쭐여보니 게시물이 14000개 정도 까지 남기면 홈페이지가 정상으로 열리더군요,

 

그래서 mysql에서 show processlist;를 사용해 연결상태를 확인해본결과

조회수를 올려주는 명령과  select count(*)  명령이 가득 있더군요,

 

그래서 일단 XE소스에 조회수를 조회때마다 올려주는 소스부분을 삭제했습니다,

 

그러고 보니 남은건 select count(*) 명령인데,

 

IdUserHostdbCommandTimeStateInfo
291638rootlocalhost:3704phoneQuery1Sending data

select count(*) as "count" FROM `xe_documents` as ...

이런 Sending data상태의 똑같은 검색명령이 수십개 가득 있네요,

 

이쪽으로 잘아시는분 찾아서 부탁하니 MYSQL문제가 아닌 xe자체의 검색명령이 너무 db에 부담을 준다네요.

 

해당 검색명령이 XE소스 어디쯤에 있는지 찾아보니 \classes\db\DBMysql.class.php 바로 여기에 있더군요?

 

그래서 이부분도 주석처리를 해봤죠,  게시판에 10만개 게시물을 등록시 먹통되게 만드는 주 원인이니까요?

 

 

그런데 그 결과 참 재미 있더군요, 홈페이지 바로 열리네요,

 

10만게시물이 한 게시판에 있고 초당 페이지뷰가 대략 7-10회 입니다,

 

속도가 엄청 빠르더군요,  깜짝 놀랐습니다,

 

 

 

그런데 기쁨도 잠시,

 

게시판 하단을 보니 페이지가 1/1

 

10만개의 게시물이라면 1/5000페이지정도 되야하는게 아닌가요?

 

그리고 다시 해당 소스 아래로 쭉 훓어보니 알겠더군요,

 

 

문제를 일으킨 소스는 바로 게시판 첫 페이지 게시물 리스트를 가져오는 소스가 아닌,

 

게시판 페이지수를 가져오는 소스 비슷한듯 하네요(확신 하긴 힘들지만요, 초짜라),

 

 

원인을 찾았으니 어떻게든 해결을 해볼려고 했으나  초짜로서 마구잡이로 수정해서는 해결하기가 힘들더군요,

 

 

 

다른 xe로 만든 대형 사이트를 찾아보면 게시판당 게시물이 5만개이상인 사이트 몇 곧 잘 되는데

 

어떻게 해결한건지 도저히 공개를 않해주시니 저로서는 어쩔수 없는 상황,

 

mysql최적화하는 글을 다 찾아봐서 최적화 시도를 해봤지만 이건 분명 최적화로 해결할수 있는 문제가 아닌거 같더근요,

 

 

 

mssql로 바꿔보자니 엄두가 나질 않고,

 

 

 

이 문제로 현재 1년넘게 홈페이지 확장도 못하고 홍보도 이 문제때문에 두려워 이대로 유지하고 있는 상황이네요.

 

 

 

 

 

function queryPageLimit($queryObject, $result, $connection){
            $limit = $queryObject->getLimit();
            // Total count
            $temp_where = $queryObject->getWhereString(true, false);
            $count_query = sprintf('select count(*) as "count" %s %s', 'FROM ' . $queryObject->getFromString(), ($temp_where === '' ? '' : ' WHERE '. $temp_where));
            if ($queryObject->getGroupByString() != '') {
                    $count_query = sprintf('select count(*) as "count" from (%s) xet', $count_query);
            }

            $count_query .= (__DEBUG_QUERY__&1 && $queryObject->query_id)?sprintf (' '.$this->comment_syntax, $this->query_id):'';
            $result_count = $this->_query($count_query, $connection);
            $count_output = $this->_fetch($result_count);
            $total_count = (int)$count_output->count;

            $list_count = $limit->list_count->getValue();
            if (!$list_count) $list_count = 20;
            $page_count = $limit->page_count->getValue();
            if (!$page_count) $page_count = 10;
            $page = $limit->page->getValue();
            if (!$page) $page = 1;

            // total pages
            if ($total_count)
                    $total_page = (int) (($total_count - 1) / $list_count) + 1;
            else
                    $total_page = 1;

            // check the page variables
            if ($page > $total_page) $page = $total_page;
            $start_count = ($page - 1) * $list_count;

            $query = $this->getSelectPageSql($queryObject, true, $start_count, $list_count);

            $query .= (__DEBUG_QUERY__&1 && $queryObject->query_id)?sprintf (' '.$this->comment_syntax, $this->query_id):'';
            $result = $this->_query ($query, $connection);
            if ($this->isError ())
                return $this->queryError($queryObject);

            $virtual_no = $total_count - ($page - 1) * $list_count;
            $data = $this->_fetch($result, $virtual_no);

            $buff = new Object ();
            $buff->total_count = $total_count;
            $buff->total_page = $total_page;
            $buff->page = $page;
            $buff->data = $data;
            $buff->page_navigation = new PageHandler($total_count, $total_page, $page, $page_count);
글쓴이 제목 최종 글
도라미 포럼모듈의 이상한 한글패치에 대응하기위한 번역파일 [20] file 2013.05.03 by guny
요술봉 텍스타일로 독립 블로그 운영하시는분 계실까요? [2] 2013.05.04 by 강하레
카이닉스 비밀댓글에 관한 고찰.. (커뮤니티 운영하시는분들 공감하시나요?) [5] 2013.05.05 by 강하레
유샤인 버젼 1.7.3.1에서 메뉴에디터 쓰기에서 하나 물어 봅시다... [9] file 2013.05.05 by IZUZero
Beart 1.7.3.2로 업그레이드 이후에 관리자 화면이... [1] file 2013.05.06 by Beart
Canto 외부페이지 관련 문제.. [1] 2013.05.06 by 드비츠로
도라란 회원정보에서 프로필이미지,이미지닉네임등이 제대로 표시 되시나요? [3] 2013.05.06 by 푸시아
sejin7940 XE 1.5 이후부터는 페이지 모듈에도 스킨이 있다는거 아세요? ^^ [6] 2013.05.06 by 드비츠로
AppSeedKorea Nginx / Apache [4] 2013.05.07 by AppSeedKorea
큰성565 통합검색을 제거하는 방법은 어떤 것이 있을까요??.. [1] 2013.05.07 by 몽실아빠
메테워 아파치 초보가 이용할만한 사이트 없을까요? [1] 2013.05.07 by AppSeedKorea
EnterTM 메뉴를 통해서만 모듈추가 가능한건 문제가 있는데.. [3] 2013.05.09 by 오블리고
딸꾹질 포인트로 회원정리를 해야 할때 어떻게들 하시나요? [1] 2013.05.09 by 몽실아빠
드비츠로 이메일에 대한 멍청한 질문 [11] 2013.05.09 by 고양이멍멍
세계정복자 이 문제가 도통 해결이 안되네요;;;  
BonaSera 짧은주소 생성은 좋은데 구글 웹마스터 도구에서 안 좋게 인식하는것 같습니다. [7] 2013.05.10 by YJSoft
씨지크 크롬에서 파일첨부 안되시는분 계시나요? [12] file 2020.03.14 by 콜롬보.
박물관 쌍따옴표와 신디케이션  
imgXE™ 신디케이션 에잇...젠장.. 한달에 한번 그날이 또 왔네 ㅡ,.ㅡ [6] file 2013.05.11 by imgXE™
haanakiri 데이터 들여오기 시 댓글 안 옮겨지는 문제... [4] file 2013.05.11 by 마야인