2014-06-13 2 views
1
궁금

나는이 같은 함수 외부하여 PDO를 준비하여 쿼리의 배치를 가속화 할 수 있다면 :PHP + MySQL을 + PDO 쿼리 속도 성능

$before = microtime(true); 

// note this line 
$query=$dbh->prepare("SELECT something FROM test WHERE record=:param"); 


for ($i=0 ; $i<1000 ; $i++) { 
    callMe("worldcup2014"); 
} 

function callMe($param) { 
    global $dbh, $query; 
    $query->bindParam(':param', $param); 
    $query->execute(); 
    $result = $query -> fetch(); 
} 

$after = microtime(true); 
echo ($after-$before) . " sec\n"; 

을 그리고 그것은 내부의 준비보다 약간 빠릅니다 이런 기능 :

$before = microtime(true); 

for ($i=0 ; $i<1000 ; $i++) { 
    callMe("worldcup2014"); 
} 

function callMe($param) { 
    global $dbh; 

    // line is now here inside function 
    $query=$dbh->prepare("SELECT something FROM test WHERE record=:param"); 

    $query->bindParam(':param', $param); 
    $query->execute(); 
    $result = $query -> fetch(); 
} 

$after = microtime(true); 
echo ($after-$before) . " sec\n"; 

첫 번째 예는 두번째 예는 약 0.65secs 결코보다 0.63 초 소요 때때로 약 0.61 초, 0.60 초

걸린다.

나는 그것이 사소한 차이라는 것을 알고 있지만 Pdo 쿼리 속도를 높이는 데 고려해야 할 다른 것들이 있습니까? 참고 : 결과를 저장하거나 캐시 할 수 없습니다. 신선한 데이터를 수집해야합니다.

+1

색인을 추가하는 방법에 대해 – Satya

+0

죄송합니다. 정확히 무엇을 의미합니까? –

+0

http://google.com/search?q=database+index –

답변

0

예, 준비된 쿼리를 사용하면 얻을 수있는 이점 중 하나가 성능 향상입니다. 동일한 쿼리를 여러 번 실행하려면 단 한 번만 준비한 다음 반복적으로 실행해야합니다. 쿼리를 준비하려면 데이터베이스를 호출해야하며 비용이 많이 듭니다.

bindParam 번만 호출하면 더 많은 기능을 향상시킬 수 있습니다. bindParam은 변수 참조에 바인딩되므로 변수를 다시 할당하고 execute()을 호출하기 만하면 변수를 다시 바인딩 할 필요가 없습니다. 그러나 함수를 입력 할 때마다 매개 변수 변수의 새 버전을 가져오고 함수 호출간에 참조가 유지되지 않으므로 함수에서 쿼리를 실행할 때이 작업이 작동하지 않습니다.

는 그래서이 의사 코드처럼한다 :

prepare statement 
bind parameter to $var 
foreach ($array as $var) { 
    execute 
} 

당신은이 같은 하나 개의 쿼리에이를 돌 수 있었다 :

$in = implode(', ', array_fill(0, count($array), '?')); 
$sql = "SELECT something FROM test WHERE record IN ($in)"; 
$stmt = $dbh->prepare($sql); 
$stmt->execute($array); 
$results = $stmt->fetchAll(); 

이 반복 쿼리보다 훨씬 더 효율적이어야한다.

+0

질문을받지 못한 것 같습니다. 그는 설명을 구하는 것이 아니라 개선을 요구하고 있습니다. 루프에서 이러한 함수를 실행하는 것은 매우 어리 석고 유용하지 않습니다. –

+0

예, 단지 0.01에서 0.02로 줄였습니다. ok @ 상식으로, 항상 다른 매개 변수를 사용하여 쿼리를 실행해야합니다.1000 루프는 벤치 마크 목적으로 만 사용됩니다. –

+0

@YourCommonSense 실제 응용 프로그램이 동일한 매개 변수 값을 반복적으로 사용하지 않는다고 가정합니다. – Barmar

-1

-> prepare()가 한 번만 호출되므로 (메모리의 한 문자열) 첫 번째 명령이 더 빠릅니다. 두 번째로는 각 루프에서 생성하고, 메모리에 고유 한 것으로 저장하는 것은 (준비 문자열)입니다. 그래서 우리는 속도의 시간차가 있습니다.

추신 : 내 생각. $)

편집 : 내가이 속도를 높일 수 있다고 생각하지 않습니까?

+0

의견을 의견에 표기해야합니다. –