2011-07-31 3 views
0

나는 프로세스 창녀라고 알고있는 두 영역을 가지고 있지만 더 나은 방법을 모른다. 문제이러한 쿼리는 어떻게 최적화 할 수 있습니까?

2 개 개의 장소는 여기

http://i.imgur.com/Kb5Bv.png

표시되고 해당 쿼리

지역 1

$nresult = mysql_query("SELECT time 
         FROM log 
         ORDER BY time 
         LIMIT 1") or die(mysql_error); 

$nr = mysql_fetch_assoc($nresult); 

$aresult = mysql_query("SELECT * 
         FROM log") or die(mysql_error); 

$an = mysql_num_rows($aresult); 

$aresult = mysql_query("SELECT AVG(players) 
         FROM log") or die(mysql_error); 

$ap = mysql_fetch_assoc($aresult); 

$average = round($an/((time()-$nr['time'])/60/60), 2); 

echo "<p class=\"tf2\"><span>{$an}</span> items since " . date("F j, Y", $nr['time']) . " at " . date("g:i a", $nr['time']) . ".<br /><span>" . $average . "</span> items received per hour (<span>" . round($average/$ap['AVG(players)'], 2) . "</span>/player/hour).<br />Showing <span>{$_SESSION['limit']}</span> items per page.</p>"; 

지역 2

당신이 볼 수 있듯이 는
if (!empty($_GET['s']) && !empty($_GET['t']) && !empty($_GET['m'])&& !empty($_GET['q'])) { 

    if ($_GET['m'] != 'all') { 

     $m = "AND method = {$_GET['m']}"; 
    } 
    else { 

     $m = ''; 
    } 

    if ($_GET['q'] != 'all') { 

     $q = "AND quality_id = {$_GET['q']}"; 
    } 
    else { 

     $q = ''; 
    } 

    if ($_GET['s'] == ' ') { 

     $s = '1=1'; 
    } 
    else { 

     $s = "{$_GET['t']} LIKE '%" . mysql_real_escape_string($_GET['s']) . "%'"; 
    } 

    $num_result = mysql_query("SELECT * 
           FROM log 
           LEFT JOIN item_definition 
           on log.item = item_definition.item_definition_desc 
           LEFT JOIN method 
           on log.method = method.method_id 
           LEFT JOIN item 
           on item_definition.item_definition_id = item.item_id 
           LEFT JOIN server 
           on log.server = server.ip 
           LEFT JOIN quality 
           on log.quality = quality.quality_id 
           WHERE {$s} 
           {$m} 
           {$q}") 
           or die(mysql_error()); 
} 
else { 

    $num_result = mysql_query("SELECT * 
           FROM log") or die (mysql_error()); 
} 

$total = mysql_num_rows($num_result); 

echo "<center>" . $total . " results</center><br />"; 

라이브 페이지는 그것이로드를위한 시간의 좋은 금액을 소요, 여기 http://www.tf2items.711clan.net/

입니다.

팁을 주시면 감사하겠습니다.

+1

안녕하세요 [바비 테이블] (http://xkcd.com/327/). 코드가 안전하지 않습니다! 귀하의 응용 프로그램은 SQL 주입에 취약합니다. mysql_real_escape_string()을 사용하여 SQL 쿼리에 사용 된 모든 매개 변수를 이스케이프 처리합니다. 이'$ m = "AND method = {$ _GET [ 'm']} ;;에 의해 미끄러지지 않게하십시오. – Shef

+0

처음에는 테이블의 ('log','item_definition', ...) 정의를 추가하십시오 : 필드, 타입, 제약, (프라이 머리 키, 외래 키), 인덱스, 엔진. –

답변

4

LIMIT/OFFSET 명령이 표시되지 않습니다. 상점에서 페이징을 사용하면이 기능이 향상 될 수 있습니다. 또는 검색 필터가 변경되지 않는 경우 어딘가에 캐시하려고 할 수도 있습니다.

+0

그러나 테이블에있는 모든 행을 제한하면 어떻게 계산합니까? –

+2

당신은 요소만을 계산하는 분리 쿼리를 수행합니다. 많은 데이터를 반환 할 필요가 없다면 더 빨리 처리 할 수 ​​있습니다. – duedl0r

+0

@ duedl0r : 이미 "SELECT * FROM log"쿼리를 사용하고 계십니까? –

0

두 번째 쿼리를 SELECT COUNT(*) FROM log으로 바꾸십시오. 행 수를 얻고 행 데이터를 무시하기 때문입니다.

관련 문제