2017-02-07 1 views
1

저는 MySQL과 PHP의 초보자입니다.forloop에서 MySQL을 사용하여 데이터베이스에서 데이터 가져 오기

날짜 범위 (하루 1 일에서 2 일까지, 다음 날 2에서 3 일까지 등)로 데이터를 가져 오는 데 필요한 코드는 다음과 같습니다.

function getData($query) { 
    global $connect; 
    $result = mysqli_query($connect, $query); 
    if (!$result) { 
     echo 'MySQL Error: '.mysqli_error($connect); 
     die(); 
    } 
    return mysqli_fetch_assoc($result); 
} 

$dayZero = date_create('2017-01-21'); 
$dayToday = date_create('Y-m-d'); 
$diff = date_diff($dayZero, $dayToday)->format('%a'); 

for ($i = 0; $i < $diff; ++$i) { 
    $start[$i] = date('Y-m-d', date_format($dayZero, 'U') + (24*60*60)*($i)); 
    $end[$i] = date('Y-m-d', date_format($dayZero, 'U') + (24*60*60)*($i+1)); 
    $days[$i] = getData('SELECT count(*) AS "b" FROM `table_name` WHERE `timestamp` BETWEEN "'.$start[$i].'" AND "'.$end[$i].'"')['b']; 
} 

코드는 예상대로 작동하지만 매우 느리게 실행됩니다. 내 추측은 그것이 반복 될 때마다 데이터베이스를 검사해야하기 때문입니다.

더 빠르게 실행할 수있는 방법이 있습니까? 아니면 제가 할 수있는 최적화가 있습니까?

+3

타임 스탬프 계산을 건너 뛰고'timestamp BETWEEN '2017-01-21'AND '2017-01-22'(단지 예제)를 사용할 수 있습니다. 또한 쿼리를 다시 확인하십시오. 보이지 않습니다. – Raptor

+0

주어진 기간 내에 행 수만 얻으려고합니까? –

+0

@ Marc-AntoineParent '2017-01-21'부터 매일 행 번호를 얻으려고합니다. –

답변

1

예! 좋은 질문입니다. 이전처럼 쿼리를 실행할 수 있지만 더 좋은 옵션은 준비된 문을 사용하는 것입니다. 이 준비된 문으로 쿼리를 분리하고 그것의 변수는 여기를 참조하십시오

http://www.w3schools.com/php/php_mysql_prepared_statements.asp

실제 문 또는 쿼리 서버를 한 번에 전송됩니다. 이 후 서버는 변수를 제공 할 때까지 기다립니다.

이 기능은 서버가 캐싱을 사용하여 성능을 크게 향상시킬 수있는 성능 응용 프로그램 (사용자와 같은)에 적합합니다. 또한 서버가 주입 공격으로부터 보호되는 보안 응용 프로그램에 선호되는 방법입니다.

마지막으로 SQL 쿼리를 최적화하는 방법은 여러 가지가 있으며, 그 중 하나 일뿐입니다. 당신은 정말로 항상 준비된 문장을 사용해야합니다.

관련 문제