포럼

하나의 게시판에 게시물 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);
글쓴이 제목 최종 글
브레인630 관리자화면에서 회원목록 그룹별로 보기 [5] 2013.03.22 by 브레인630
푸시아 checkCSRF 꼭 해야하나요? 이거 안하면 보안에 문제 생기나요? [6] 2013.03.22 by criuce
니는뜬데이~ 1.7.3.0 업데이트 후 소셜 서버 설치 및 사용해보신분.. 사용이 가능할까요? [5] 2013.03.22 by 큰돌♡
rjsoo 1.5에서 1.7로 업데이트후 홈페이지 메인메뉴가 어드민페이지 사이트메뉴편집에서 안보여서 문의 합니다.  
푸시아 개발자 팁 통합 검색 [8] 2013.03.22 by 푸시아
캠핑카USA 1.7.3 업그레이드 후, 에디터에서 문제점  
이온디 바로가기로 등록한 메뉴도 레이아웃 일괄 변경하면 적용이 되나요? [1] 2013.03.22 by OEZ
푸시아 1.7 테스트 공간을 이제야 깔았네요  
오뎅궁물 core 1.5.4.3에서 1.7.3.0으로 업데이트 후 곤란한 점  
푸시아 애드온에서 세션 [6] 2013.03.21 by 푸시아
키스미베이베 추천/비추천 노출 애드온 수정...신고버튼(거의완료단계인거같은데 ㅜㅜ) 도와주세요 [9] 2013.03.21 by OEZ
또별 메뉴연결구조 혁명적 혁신 방법 [15] 2013.03.21 by 컴토피아
Gunmania 알림센터 Lite + 회원가입 확장 모듈 조합 쓰시는분? [1] 2013.03.21 by 2donggalbi
이온디 1.7 사이트맵에 관해 이야기 나눠 봅시다 [5] 2013.03.20 by 윈컴이
쓰리공주 XE 1.7.3 관리자 메뉴 초기화시 메뉴가 나타나지 않는 현상? [3] file 2013.03.20 by 쓰리공주
이온디 유투브 모듈도 있나요?? [2] 2013.03.20 by 라미아스튜디오
이온디 1.7.3 좋아요~!! [14] 2013.03.20 by 라미아스튜디오
한마음^^ 1.7.3과 V3 사이트가드의 충돌 문제 [2] 2013.03.19 by 독도2005
10110 텍스트?로 인하여 페이지 일부분이 깨지는 현상 [3] file 2013.03.19 by SCAC
또별 Core1.7.0 버전에서 1.5x보다 후퇴한 기능에 대해서 [22] 2013.03.19 by Garon