使用占位符时 PDO 执行速度较慢

2024-03-15

我正在制作一些返回计数和分组结果的 JSON 端点。对于此端点,我使用 PDO 和命名占位符。当使用命名占位符时,PHP 响应最多需要 6 秒的时间execute阶段。当执行相同的查询并将值直接放入查询中时,响应几乎是即时的。

我正在更新仍使用 mysql_query() 的旧代码来使用 PDO 语句。

    <?php
    header("Access-Control-Allow-Origin: *");
    header("Content-Type: application/json; charset=UTF-8");
    header("Access-Control-Allow-Headers: Content-Type, Access-Control-Allow-Headers, Authorization, X-Requested-With");
    $conn = new PDO('mysql:host=localhost;dbname=nameOfDB', 'username', 'password');
    $conn->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $conn->exec("set names utf8");

    $query_slow = "SELECT t.meta as meta, count(*) as cnt 
    FROM field, repo, t, uplink, link  
    WHERE (
        repo.rp1 = field.id OR 
        repo.rp2 = field.id OR 
        repo.rp3 = field.id OR 
        repo.rp4 = field.id)
    AND repo.combination = t.meta 
    AND t.doc_id = uplink.doc_id 
    AND uplink.written = 1 
    AND uplink.link_id = link.id 
    AND field.id = :field 
    AND t.earliest > :min 
    AND t.latest < :max 
    GROUP BY t.meta 
    ORDER BY cnt desc";

    if($parameters){
        $stmt = $conn->prepare($query_slow);
        $stmt->execute($parameters);
        $data = $stmt->fetchAll(PDO::FETCH_ASSOC);
        echo json_encode($data, JSON_UNESCAPED_UNICODE );
    }

如果我做一个var_dump($parameters)我得到以下返回:

    $parameters = array(3) {
      [":field"]=>
      int(5)
      [":min"]=>
      int(-1000)
      [":max"]=>
      int(600)
    }

这是快速查询:

    $query_fast = "SELECT t.meta as meta, count(*) as cnt 
    FROM field, repo, t, uplink, link  
    WHERE (
        repo.rp1 = field.id OR 
        repo.rp2 = field.id OR 
        repo.rp3 = field.id OR 
        repo.rp4 = field.id)
    AND repo.combination = t.meta 
    AND t.doc_id = uplink.doc_id 
    AND uplink.written = 1 
    AND uplink.link_id = link.id 
    AND field.id=5 
    and t.earliest > -1000 
    and t.latest <600  
    GROUP BY t.meta 
    ORDER BY cnt desc";

    if(1==1){
    // I ditched the $parameters, so my execute is empty.
    $stmt = $conn->prepare($query_slow);
    $stmt->execute();
    $data = $stmt->fetchAll(PDO::FETCH_ASSOC);
    echo json_encode($data, JSON_UNESCAPED_UNICODE );
    }


Slow_query 最多可能需要 6 秒才能运行。如果我使用填充的值和空的值运行相同的查询execute()我几乎立刻就得到了回应。我对 PDO 做错了什么?

当给一个数组时execute()我的页面响应速度很慢。当使用没有参数的查询时。响应是即时的。

我的计时代码按照@RiggsFolly的要求:

所以我在那里运行了计时代码:

    if($parameters){
    $time_prepare = microtime(true);
    $stmt = $conn->prepare($querygraph);
    $time_pre_exec = microtime(true);
    $stmt->execute(($parameters));
    //$stmt->execute();
    $time_post_exec = microtime(true);
    $data = $stmt->fetchAll(PDO::FETCH_ASSOC);
    $time_post_fetch = microtime(true);
    echo json_encode($data, JSON_UNESCAPED_UNICODE );
    }

这是使用参数 5、-800 和 800(与之前使用的相同)。我的计时代码显示:

start:          1563972660.9188      (First line of the script)
prepare:        1563972660.9197        ==$time_prepare
pre execution:  1563972660.9201  ==$time_pre_exec
post execution: 1563972669.0058  ==$time_post_exec ==> 9 seconds!
post fetch:     1563972669.0058 

当在没有占位符的查询上使用相同的参数时,我使用相同的查询和空的execute()。我将占位符替换为我在准备好的语句中使用的相同值。时间看起来像:

prepare:        1563973120.2965
pre execution:  1563973120.2969      //before execution()
post execution: 1563973120.312      //after executeion()
post fetch:     1563973120.3121

对于那些有类似问题的人;根据@YourCommonSense 的建议修复了该问题。

我必须明确使用bindValue();现在整个执行(从开始到结束)大约需要 0.02 秒,这比我希望的要好得多。对于动态生成的查询,我将代码更改为:

$conditions = [];           //values to be inserted by type on placeholder
$parameters = [];           //kind of thing to execute in the query with the placeholder (substring of a query with a named placeholder)
$bindTypes=[];              //the type expected to be for a placeholder (the function takes this as third argument. It should be a long type (strings give errors, hence the if/else if block))
$placeholders=[];           //contains only the :placeholders. Use this to tell the bindvalue() function that you want to bind a value X to placeholder :X 

if(isset($_GET["min"])){
    $mindate = (int)$_GET["min"];
    if($mindate != ""){
        $conditions[] = 't.earliest>= :mindate';
        $parameters[] = $mindate;
        $bindTypes[] = 'int';
        $placeholders[] = ':mindate';
    }
}
if(isset($_GET["max"])){
    $maxdate= (int)$_GET["max"];
    if($maxdate!= ""){
        $conditions[] = 't.latest>= :maxdate';
        $parameters[] = $maxdate;
        $bindTypes[] = 'int';
        $placeholders[] = ':maxdate';
    }
}

if($parameters){
    $stmt = $conn->prepare($querygraph);
    for ($i=0; $i<count($placeholders); $i++) {

        if($bindTypes[$i]=='str'){// it's better to use integers as comparison 
            $stmt->bindValue($placeholders[$i], $parameters[$i], PDO::PARAM_STR);
        } else if($bindTypes[$i]=='int'){
            echo $placeholders[$i];
            $stmt->bindValue($placeholders[$i], $parameters[$i], PDO::PARAM_INT);
        }

    } 
    $stmt->execute();
    $data = $stmt->fetchAll(PDO::FETCH_ASSOC);
    echo json_encode($data, JSON_UNESCAPED_UNICODE );
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用占位符时 PDO 执行速度较慢 的相关文章

  • 选择一组数字以达到最小总数的算法

    给定 一组数字n 1 n 2 n 3 n x 还有一个数字M 我想找到最好的组合 n a n b n c n gt M 该组合应达到达到或超过 M 所需的最小值 没有其他组合可以提供更好的结果 将在 PHP 中执行此操作 因此可以使用 PH
  • CodeIgniter 控制器 - JSON - AJAX

    我正在尝试通过 AJAX 使用 CodeIgniter 发送表单构建 并尝试使用 JSON 获取响应 但是 我只在打开开发人员选项卡时看到响应 我什至不确定这是否实际上是响应 因为它显示了两个 json 数据 它所显示的只是加载旋转器 然后
  • PHP 无法加载动态库“php_pdo_oci.dll”

    我在 Windows 8 上运行 Apache 2 4 7 和 PHP 5 5 9 我安装了 PHPUnit 并开始弹出此警告图像 警告 是的 我在 php ini 中启用了扩展加载以及 extension dir 以更正文件夹 并且该文件
  • 从类似 cronjob 的语法创建“下次运行时间”日期

    在我正在创建的应用程序中 用户可以安排重复任务 生成间隔模式的简单值是 Minute 0 59 90 each minute Hour 0 23 90 each hour Day of month 1 31 90 each day of m
  • 在 PHP 中比较两个对象的最快方法是什么?

    假设我有一个对象 在本例中为 User 对象 并且我希望能够使用单独的类来跟踪更改 用户对象不必以任何方式改变它的行为才能发生这种情况 因此 我的单独的类创建它的 干净 副本 将其存储在本地某个位置 然后可以将 User 对象与原始版本进行
  • 编辑 HTACCESS 文件以防止直接访问特定文件夹中的特定文件

    我试图阻止直接访问子文件夹中的特定文件 我意识到这个论坛上有很多描述类似问题的主题 但是 我的似乎有点尴尬 由于我已经存在 HTACCESS 文件 这是文件的文件路径 www example com PRINCIPAL PROJECTS m
  • 如何从 MySQL 数据查询创建 XML 文件?

    我想知道一种仅使用 MySQL 查询创建 XML 文件的方法 根本不使用任何脚本语言 有关于这个主题的书籍 教程吗 UPDATE 我想澄清一下 我想使用 sql 查询将 XML 数据转发到 php 脚本 Here s 关于从 MySQL S
  • 如何将我的 init 函数中的代码集中到所有控制器中?

    public function init this gt view gt user Zend Auth getInstance gt getIdentity this gt view gt siteName Zend Registry ge
  • MYSQL:如何在同一查询中联接两个表,两次引用同一个表

    我有两张桌子 我正在尝试将下面的示例两个表与表 1 引用表 2 两次结合起来 例如 如果我查看表 1 组 2 和成员 7 它应该查找表 2 中的 ID 并给出输出 Group Members Name Name 2 7 Blue Dog T
  • 如何在多次尝试后延迟登录尝试 (PHP)

    我正在开发一个用 PHP 构建的相当大的网站 该网站可能会有很多用户 我正在寻找一种方法来保护登录屏幕免受自动尝试的影响 我已经在注册表中添加了验证码检查 但还想进一步强化网站 据我所知 StackOverflow 上也有类似的问题 而且我
  • 使用 Instagram Basic Display API 时出现“无效平台应用程序”错误

    我正在尝试使用 Instagram Basic 显示 API 但是当我发布授权代码以获取访问令牌时 我不断收到以下错误 error type OAuthException 代码 400 error message 平台应用无效 我正在遵循此
  • 如何纠正这个非法字符串偏移?

    我收到此错误 警告 第 32 行 home mysite public html wp content themes evento lib php extra class php 中的非法字符串偏移 type 我意识到文件中的这部分代码是错
  • 如何通过php获取网页的Open Graph协议?

    PHP 有一个简单的命令来获取网页的元标记 get meta tags 但这仅适用于具有名称属性的元标记 然而 开放图谱协议如今变得越来越流行 从网页获取 opg 值的最简单方法是什么 例如 我看到的基本方法是通过 cURL 获取页面并使用
  • 奇怪的 MySQL Python mod_wsgi 无法连接到 'localhost' (49) 上的 MySQL 服务器问题

    StackOverflow上也有类似的问题 但我还没有发现完全相同的情况 这是在使用 MySQL 的 OS X Leopard 机器上 一些起始信息 MySQL Server version 5 1 30 Apache 2 2 13 Uni
  • 如何通过ssh检查ubuntu服务器上是否存在php和apache

    如何通过ssh检查Ubuntu服务器上apache是 否安装了php和mysql 另外如果安装的话在哪个目录 如果安装了其他软件包 例如 lighttpd 那么它在哪里 确定程序是否已安装的另一种方法是使用which命令 它将显示您正在搜索
  • WordPress 自定义帖子类型未显示在搜索结果中

    我在 WordPress 中遇到自定义帖子类型 测验 和搜索的问题 自定义帖子类型未显示在我的搜索结果页面中 我的搜索结果中仅显示默认的帖子内容 以下是我使用的代码 函数 php函数create posttype register post
  • 选择获取与 MySQL Group 中 max 对应的整行

    当我使用Max使用后查找特定 MySQL 组中字段的最大值GROUP BY 是否可以获取包含最大值的整行 我在处理一些论坛代码时偶然发现了这个线程 我想获取每个线程的最新帖子并将其显示在特定板的线程列表中 Quassnoi上面的回答对我非常
  • 查询为空 Node Js Sequelize

    我正在尝试更新 Node js 应用程序中的数据 我和邮递员测试过 我的开发步骤是 从数据库 MySQL 获取ID为10的数据进行更新 gt gt 未处理的拒绝SequelizeDatabaseError 查询为空 我认识到 我使用了错误的
  • PHP递归遍历对象树[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • ZF3/2 - 如何捕获 EVENT_DISPATCH 侦听器中引发的异常?

    有什么方法可以在 EVENT DISPATCH 监听器中抛出异常吗 class Module public function onBootstrap EventInterface event application event gt get

随机推荐

  • System.Security.SecurityException:主体权限请求失败

    任何人都可以帮助我指出如何修复此错误的正确方向吗 System Web Services Protocols SoapException Server was unable to process request gt System Secu
  • 获取kivy中选定复选框的值

    test py import sqlite3 as lite from kivy uix screenmanager import Screen from kivy app import App from kivy lang import
  • Rsync 仅创建符号链接

    我目前 rsync 运行良好 它将我的所有文件从一个目录复制到另一个目录 唯一的事情是它是物理复制文件 我有很多大文件 我不想拥有所有文件的副本 我只想在新目录中创建一个符号链接 以便我可以在网页上提供数据 源目录中有一些我不希望公众看到的
  • 如何识别和删除换行符和空格?

    我正在通过按组件分隔字符串来创建一个 nsmutable 数组 这会导致在数组中插入大量换行符和空格 如何识别和删除它们 for int i 0 i
  • 解码ima4音频格式

    为了减少 iPhone 应用程序的下载大小 我压缩了一些音频文件 具体来说 我在命令行上使用 afconvert 将 wav 格式更改为 caf 格式 带 ima4 压缩 我读了this http www wooji juice com b
  • 带有循环动画的浓缩咖啡冻结视图

    我有一个视图 其中一个元素在无限循环中使用以下内容进行动画处理
  • Django REST Framework 添加一个 ViewSet 作为另一个 ViewSet 上的详细信息

    我有两种模型 一种是盒子 一种是盒子评论 class BoxViewSet viewsets ModelViewSet queryset Box objects all permission classes IsAuthenticated
  • 如何将相机附加到 Spark.components.VideoDisplay

    我正在使用 Flash Builder 并创建了一个 Spark 应用程序 Flex 项目 该项目将从本地摄像头传输视频 如果我使用mx controls VideoDisplay 没有问题 因为它有attachCamera camera
  • 使用 QEMU 模拟 Big Endian ARM 系统

    是否可以编译一些 Linux 内核并通过 QEMU 运行它 模拟一些 Big Endian ARM 处理器 如果 QEMU 无法做到这一点 我很想知道其他可以做到这一点的系统模拟器 我的基本目标是在尽可能多的本机环境中运行和调试专用的 Bi
  • 从字符串中删除点符号[重复]

    这个问题在这里已经有答案了 可能的重复 如何在 JavaScript 中替换字符串中的所有点 https stackoverflow com questions 2390789 how to replace all points in a
  • Xamarin Forms Maps 将图像动态添加到 InfoWindow

    我已经从官方网站的示例中实现了自定义渲染器 但我确实需要每个引脚发送不同的图像 图像将通过 API 作为 base64 字符串传递 我真的需要 Android 和 iOS 的实现 案例场景 我正在将 CustomPins 加载到地图上 自定
  • 如何在PyQt5应用程序中显示来自moviepy的write_audiofile的转换进度?

    我想使用 moviepy 库中的 write audiofile 函数将 mp4 文件转换为 mp3 文件 并使用进度条在 PyQT5 应用程序中显示进度 当我使用时 mp4audio write audiofile filename lo
  • 网格单元格的边框在本机反应中并不统一

    我正在尝试使用 React Native 构建一个简单的计算器 I created a button component with borderWidth 0 5 and used this button component to form
  • 如何构建具有独立推理和训练部分的 TF 图?

    参考文献这个帖子 https stackoverflow com questions 40340807 how can i build a tf graph for both training and inference with tf t
  • 将枚举与字符串写入包裹

    我有这样的 Parcelable 枚举 public enum Option implements Parcelable DATA BASE TRIPS BIG PHOTOS OLD PHOTOS FILTERS IMAGES CATEGO
  • URL 变量中间的问号

    如果我有一个要传递 URL 的变量 并且其中有一个问号 我是否只需要转义该问号 如果没有 我怎样才能确保它像预期的那样通过 问号 URL 编码为 3F 但是您应该对整个事情使用适当的编码器 而不是手动编码字符
  • Google Chrome 地址栏在调整大小时消失

    在 MacOS Yosemite 上运行最新版本的 Google Chrome 版本 41 0 2272 101 64 位 时 当我调整地址栏大小时 地址栏会松开 并且必须重新启动 Google Chrome https www youtu
  • 如何计算图像有无噪声和几何畸变?

    我需要在 iPhone 中制作一个应用程序 需要计算图像中的噪声 几何变形和其他扭曲 这个怎么做 我用 opencv iphone 做了一些图像处理的东西 但我不知道如何计算这些参数 1 如何计算图像中的噪声 2 什么是几何变形以及如何计算
  • 如何在 iPhone 中显示 .tiff 图像?

    我想在我的本机 iphone 应用程序中显示来自服务器的 tiff 图像 是否可以在本机 iPhone 应用程序中显示 tiff 图像 我花了 2 个小时试图解决这个问题 但没有成功 我在网上搜索了近2个小时 没有解决这个问题 谁能帮我解决
  • 使用占位符时 PDO 执行速度较慢

    我正在制作一些返回计数和分组结果的 JSON 端点 对于此端点 我使用 PDO 和命名占位符 当使用命名占位符时 PHP 响应最多需要 6 秒的时间execute阶段 当执行相同的查询并将值直接放入查询中时 响应几乎是即时的 我正在更新仍使