php - call_user_func_array 太慢了吗?

标签 php mysql

我正在使用 mysqli 和准备好的语句为我的数据库编写一个简单的搜索引擎,我目前正在使用 call_user_func_array 来动态创建我的查询。我的问题是:使用 mysqli 是否有更快或更好的方法来做到这一点? 这是我的代码:

<?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();
?>

最佳答案

您的问题中有很多问题需要解决 - 而 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']);

因此请求像 /foo?paramsQuery=a,b,c,d,e,f,g,h,i,j 这样的 url 当前将触发 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查看您的查询在做什么
  • 使用xdebug profiling查看您的代码将时间花在哪里
  • Webgrind是一种易于安装的查看 xdebug 配置文件输出的方法。

不要浪费时间优化 0.01%

call_user_func_array 确实有使用成本,这就是为什么 code like this存在。但是区别真的非常微不足道(特别是考虑到问题中超重的 UNION 查询)除非你调用它数百次以上。关注对您的应用程序性能影响最大的事情,而不是那些绝对不会以任何方式产生可衡量差异的事情。

关于php - call_user_func_array 太慢了吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10609794/

相关文章:

php echo 不打印数据

php - 如何隐藏类 ="<?php print $example;?>"CSS

php - Laravel - 在 View 中使用 Eloquent where 方法

php - 拉维尔 5 : uploading an image to send in an email

php - 使用 drush 将节点导出为 csv 文件问题

mysql - SQL : How to show the WHERE IN and WHERE NOT IN in the same line?

java - 无法使用 MySQL 作为驱动程序在 MariaDB 中执行查询

mysql - 函数在不同的服务器上变得区分大小写

php - 我希望我的链接居中并且按钮仍然有效

javascript - 自动保存用户输入的内容——最聪明的实现方式?