그누보드 튜닝 (visit_insert.inc.php) (08.05.12 수정)

불당   
   조회 7930   추천 0    

왜 max(vi_id) 값을 구해야 할까요? 
auto_increment로 vi_id의 테이블 타입을 바꾸고 inset 하면 되는데...

방문자마다 한번씩 쿼리를 하는 것이니 하루방문자 숫자만큼 max(vi_id)가 줄어듭니다.
g4_visit 테이블의 크기를 생각하면 그 영향은 아주 크다고 볼 수 있습니다.

/bbs/visit_insert.inc.php 에서

(원본)
    $tmp_row = sql_fetch(" select max(vi_id) as max_vi_id from $g4[visit_table] ");
    $vi_id = $tmp_row[max_vi_id] + 1;

    $sql = " insert $g4[visit_table] ( vi_id, vi_ip, vi_date, vi_time, vi_referer, vi_agent ) values ( '$vi_id', '$_SERVER[REMOTE_ADDR]', '$g4[time_ymd]', '$g4[time_his]', '$_SERVER[HTTP_REFERER]', '$_SERVER[HTTP_USER_AGENT]' ) ";
    $result = sql_query($sql, FALSE);

(수정본)
    $sql = " insert $g4[visit_table] ( vi_ip, vi_date, vi_time, vi_referer, vi_agent ) values ( '$_SERVER[REMOTE_ADDR]', '$g4[time_ymd]', '$g4[time_his]', '$_SERVER[HTTP_REFERER]', '$_SERVER[HTTP_USER_AGENT]' ) ";
    $result = sql_query($sql, FALSE);

phpMyAdmin에서 g4_visit 테이블의 vi_id를 auto_increment로 변경 합니다.

ALTER TABLE `g4_visit` CHANGE `vi_id` `vi_id` INT( 11 ) NOT NULL AUTO_INCREMENT


엑스엠엘님께서 조언해 주신 부분인데, visit_sum_table에서 insert를 먼저하고
update를 나중에 하는 구조는 방문자가 많은 경우 불필요한 insert를 너무 많이
수행하게 됩니다. 그래서 update를 먼저하고 insert를 하게 수정하는게 맞습니다.

(원본)

        $sql = " insert $g4[visit_sum_table] ( vs_count, vs_date) values ( 1, '$g4[time_ymd]' ) ";
        $result = sql_query($sql, FALSE);
       
        // DUPLICATE 오류가 발생한다면 이미 날짜별 행이 생성되었으므로 UPDATE 실행
        if (!$result) {
            $sql = " update $g4[visit_sum_table] set vs_count = vs_count + 1 where vs_date = '$g4[time_ymd]' ";
            $result = sql_query($sql);
        }

(수정본)

    if ($result) {
        // UPDATE를 먼저하고 오류가 발생시 insert를 실행 (엑스엠엘님)
        $sql = " update $g4[visit_sum_table] set vs_count = vs_count + 1 where vs_date = '$g4[time_ymd]' ";
        $result = sql_query($sql, FALSE);
       
        if ( mysql_affected_rows() == 0 ) {
            $sql = " insert $g4[visit_sum_table] ( vs_count, vs_date) values ( 1, '$g4[time_ymd]' ) ";
            $result = sql_query($sql);
        }


이것또한 엑스엠엘님께서 알려주신 사항입니다. vi_max와 vi_sum을 구하기 위해서 2번의 SQL문을 실행하는데, 1번에 가능 합니다.

(원본)

        // 최대
        $sql = " select max(vs_count) as cnt from $g4[visit_sum_table] ";
        $row = sql_fetch($sql);
        $vi_max = $row[cnt];

        // 전체
        //$sql = " select count(*) as cnt from $g4[visit_table] ";
        $sql = " select sum(vs_count) as total from $g4[visit_sum_table] ";
        $row = sql_fetch($sql);
        $vi_sum = $row[total];

(수정본)

        // 엑스엠엘님께서 SQL 2개를 1개로 줄여주셨습니다.
        $sql = " select max(vs_count) as cnt , sum(vs_count) as total from $g4[visit_sum_table] ";
        $row = sql_fetch($sql);
        $vi_sum = $row[total];
        $vi_max = $row[cnt];

- opencode.co.kr -
불당 2008-05
update의 경우 affected rows가 0이라도 문법의 오류가 없으면 result가 정상으로 나옵니다.
따라서, if ( mysql_affected_rows() == 0 ) { ...로 문법을 일부 변경했습니다 (빨간색...).
눈까리 2009-05

오늘 어제쿼리도 한방에..;

select
  if(vs_date = '$g4[time_ymd]', vs_count, 0) as vi_today ,
  if(vs_date = date_sub('$g4[time_ymd]', interval 1 day), vs_count, 0) as vi_yesterday

from g4_visit_sum
where vs_date >= date_sub('$g4[time_ymd]', interval 1 day)

 



제목Page 1/4
2011-01   16668   불당
2010-06   12924   불당
2013-05   14637   불당
2008-09   7674   불당
2013-01   15895   불당
2013-06   13073   불당
2008-04   7596   불당
2008-04   8245   불당
2008-04   7179   불당
2008-04   7577   불당
2008-04   5820   불당
2008-04   7931   불당
2008-04   7224   불당
2008-04   7939   불당
2008-04   15238   불당
2008-04   8674   불당
2008-04   6014   불당
2008-04   6332   불당
2008-04   8011   불당
2008-04   8067   불당
2008-04   7220   불당
2008-04   6911   불당
2008-05   5971   불당