2012-05-15 3 views
2

mysqli와 준비된 문을 사용하여 데이터베이스에 간단한 검색 엔진을 쓰고 있는데, 현재 call_user_func_array를 사용하여 동적으로 쿼리를 작성하고 있습니다. 내 질문입니다 : mysqli를 사용하여 더 빠르고 더 좋은 방법이 있습니까? 당신은 당신의 질문을 해결하기 위해 많은 것들을 가지고은 call_user_func_array가 너무 느립니다.

<?php 
session_start(); 
require('../../../scripts/bkfunctions.php'); 
header('Cache-Control: no-cache, must-revalidate'); 
header('Expires: Mon, 26 Jul 1997 05:00:00 GMT'); 
header('Content-type: application/json'); 

////////////////// 
$resultParameters = array(); 
$paramsArr =array(); 
$results = array(); 




////DB OPEN////////////////////////////////////////// 
$conn = dbConnect("ITbunker"); 
$paramsArr = explode(",", $_GET['paramsQuery']); 
$qStr=""; 
$bindParams = array('s'); 

    //////////////////////////////////// 
    foreach ($paramsArr as $n=>$k) { 

      if ($n==0) { 
      $qStr = "SELECT * FROM trabajosEnSubasta WHERE MATCH(titulo, descripcion, habilidades) AGAINST (?)"; 
      } 
      else { 
      $qStr .= " UNION SELECT * FROM trabajosEnSubasta WHERE MATCH(titulo, descripcion, habilidades) AGAINST (?)"; 
      $bindParams[0] .= 's'; 
      } 
      array_push($bindParams, $k); 
    } 
    /////////////////////////////////////// 

    ///Preparar query y ejecutar 
    $stmt = $conn->prepare($qStr); 
    call_user_func_array(array($stmt, 'bind_param'), makeValuesReferenced($bindParams)); 
    $stmt->execute(); 

/////////////////////////////////////////////////////////////////////////////////////////* 

$meta = $stmt->result_metadata(); 

    while ($campo = $meta->fetch_field()) { 
    $resultParameters[] = &$row[$campo->name]; 
    } 
    call_user_func_array(array($stmt, 'bind_result'), $resultParameters); 

    $i=0; 
    while ($stmt->fetch()) { 
     $i++; 
     foreach($row as $key => $val) { 
     $results["resultado$i"][$key] = $val; 
     } 
    } 


echo json_encode($results); 
/////////////////////////////////////////////////// 

$conn->close(); 
?> 
+1

준비된 문을 사용하는 경우 왜 동적으로 쿼리를 만들어야합니까? –

+0

내가 얼마나 많은 단어를 사용자가 제출할 것인지 알지 못하기 때문에 다른 단어를 쉼표로 구분하기 위해 $ _GET 변수를 폭발시킵니다. 단어가 php와 asp ... –

+2

인 단어를 검색하려고한다고 가정합니다 call_user_func_array는 메서드를 명시 적으로 호출하는 것보다 느리지 만 코드를 두 번만 호출 할 때 코드에 눈에 띄는 차이를 만들 가능성은 거의 없습니다. 다양한 UNION 셀렉트를 갖는 것은 페이지 로딩 시간에 1ms를 추가 할 수있는 함수를 사용하는 것보다 훨씬 비싸거나 문제가 될 수 있습니다. – AD7six

답변

4

- 그리고 call_user_func_array 그들 중 하나되지 않습니다 : 여기 내 코드입니다. 쿼리

이에서

봐 구축중인 쿼리의 종류입니다 :

SELECT 
    * 
FROM 
    trabajosEnSubasta 
WHERE 
    MATCH(titulo, descripcion, habilidades) AGAINST (?) 
UNION 
    SELECT 
     * 
    FROM 
     trabajosEnSubasta 
    WHERE 
     MATCH(titulo, descripcion, habilidades) AGAINST (?) 
UNION 
    SELECT 
     ... 

그리고 ... 당신이 그렇게 할 거라고 왜 질문을 구걸한다. 이것은 기능적으로 동일하고, 가능성이 훨씬 더 빨리는 실행 :

SELECT 
    * 
FROM 
    trabajosEnSubasta 
WHERE 
    MATCH(titulo, descripcion, habilidades) AGAINST (?) 
    OR 
    MATCH(titulo, descripcion, habilidades) AGAINST (?) 
    OR 
    ... 

봐 논리에

$paramsArr = explode(",", $_GET['paramsQuery']); 

는 따라서 URL을 요청 /foo?paramsQuery=a,b,c,d,e,f,g,h,i,j 현재 10 테이블 통합 쿼리를 실행할 것처럼, 당신은 업데이트 할 경우 귀하의 쿼리 구문은 10 개의 전체 텍스트 인덱스 쿼리가 될 것입니다. 그게 니가 원하는거야? 그것은 수 있습니다 -하지만 누군가가 알려진 habilidad 검색하는 경우 예를 들어, 그것은 더 효율적 많이 할 것 :

SELECT 
    trabajosEnSubasta.* 
FROM 
    trabajosEnSubasta 
LEFT JOIN 
    habilidades_map ON habilidades_map.trabajo_id = trabajosEnSubasta.id 
WHERE 
    habilidades_map.habilidad = "known habilidad" 

전체 텍스트 인덱스 쿼리 상대적으로 비싸고, 정말 안 당신의 귀하의 데이터를 검색하는 수단 일뿐입니다.

프로필 코드 난 당신의 코드가 실행 속도가 느린 때문에 약 call_user_func_array을 요구한다고 가정 할

. 코드에 문제가있는 것을 추측하지 마십시오 모양을 찾아을 찾으십시오.

  • 사용 explain은 쿼리 코드가이
  • Webgrind는 Xdebug는 프로파일 출력을 보는 수단을 설치하기 쉽습니다 타임의 지출 위치를 볼 수
  • 사용 xdebug profiling을하고있는 것을 볼 수 있습니다.

은 그나마

call_user_func_array 사용하는 비용을 가지고 0.01 %를 최적화하는 시간을 낭비하고, code like this가 존재하는 이유입니다. 하지만 그 차이는 수백 배 이상이라고하지 않는 한 정말 중요하지 않습니다 (특히 질문에 포함 된 초대형 UNION 쿼리에 비추어 볼 때). 응용 프로그램에 가장 큰 성능 영향을 미치는 사항에 초점을 맞추십시오. 측정 가능한 차이는 없습니다.

+0

UNION querys가 너무 비싸다는 것을 알지 못했습니다. MySQL에 관해 많은 것을 배웠습니다. 어쨌든이 정보는 매우 유익한 감사입니다. –

관련 문제