PDO 语句比 MySQL CLI 花费的时间长 400 倍 [重复]

2024-01-11

我正在运行一个 PDO 准备语句来从大约 6k 行的表中进行选择。由于 WHERE 语句具有约 5k pId,因此该特定查询最终返回所有行。该表在 pId 列上也有一个索引。

SELECT * FROM table_a WHERE pId in (?, ? ,? ....)

该查询在 php 中运行需要 4.5 秒,而在 MySQL CLI 中运行则需要 0.01 秒。 PHP 和 MySQL 的 EXPLAIN 语句是相同的,都是NOT使用 pId 上的索引。我认为这是因为MySQL知道它正在返回整个表并且不需要使用索引。

我知道准备好的语句会产生一些开销,但我在其他地方运行一个非常相似的查询(不同的表名),并且花费的时间并没有那么长(~.9 秒)。有任何想法吗?

PHP 版本:5.5

MySql版本:5.6


我怀疑缓慢的原因在于获取行、返回的行数,而不是语句中的 5000 多个绑定占位符。pId IN ( ? , ? , ... , ? )

我的建议是测试仅返回一行,提供一个已知存在/返回一行的值,然后提供 4999+ 已知不存在/不返回一行的值。

例如,如果我们知道表中的最高 pId 值,请使用高于该值的值,为这样的语句提供绑定值

 ... pId IN ( ? , ? , ? , ... , ? )

所以结果相当于运行

 ... pId IN ( 99999999 , 99999998 , 99999997 , ... , 42 )

这与我们运行的结果相同

 ... pId IN ( 42 )

我们的期望是只返回一行 ( pId = 42 )。

然后将其时间(5000+ 绑定值返回 1 行)与两个绑定值返回单行进行比较

 ... pId IN ( 99999999 , 42 )

并看看性能是否有显着差异。

(对于 5000 多个绑定值还有更多工作要做,但我不希望huge差异,但应该进行测试。


想一想,使用所有现有的绑定值设置测试可能会更容易,只需添加LIMIT 2到查询的末尾。 (我不确定MySQL是否有一些性能增强LIMIT 2.

最好添加一个条件,例如AND pId * 10 = 420

目标是提供一整套绑定值,但只返回一两行。


另一个测试是返回大量行,但仅使用几个绑定值。可能是返回 5000 多行的范围条件。

查询可以是:

 ... pId >= ? AND pId <= ? 

我们在 5000 行附近得到的提供值之间有足够大的范围。

并比较性能。

我的预测(猜测?)是性能将更多地与返回的行数相关,而不是与绑定值的数量相关。


我不确定这是否是您问题的答案,但这是我回答问题的方法......“是什么导致速度变慢,绑定值的数量或返回的行数? ”

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PDO 语句比 MySQL CLI 花费的时间长 400 倍 [重复] 的相关文章

  • 如何在 php 中访问名为变量的对象属性?

    以 JSON 编码的 Google API 返回一个如下所示的对象 updated gt stdClass Object t gt 2010 08 18T19 17 42 026Z 任何人都知道我如何访问 t value object gt
  • 如何获取共同好友列表

    你好 我想知道如何才能找到共同的朋友 我目前在思考这个问题时遇到问题 我有一个名为 users 的表 它是这样的 id name 1 Kenny 2 Jack 3 Jimmy 4 Chris 5 Meg 6 Jake 7 Micheal 8
  • 主机 localhost 不允许连接到此 MySQL 服务器 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我不小心删除了我的用户表 删除了所有用户 现在每当我尝试访问我的数据库时 它都会说 主机本地主机不允许连接到此 MYSQL 服务器 我试过
  • 如何在 Laravel 5.3 中进行自定义身份验证

    我在 Laravel 5 3 自定义身份验证中遇到问题 希望在检查时使用我自己的函数或页面Auth check 它返回false 这是用户控制器 namespace App Http Controllers use App User use
  • PHP session_destroy() 警告会话对象销毁失败[重复]

    这个问题在这里已经有答案了 我有这个 php 脚本 但在破坏会话时遇到问题 我收到这个警告 警告 session destroy 会话对象销毁失败 第 6 行 C xampp htdocs template nota finalizare
  • 如何在 Symfony 和 Doctrine 中实现 ManyToMany 和 OneToMany?

    我发现该文档在解释实体之间关系的创建方面非常糟糕 因此 我必须向我的 StackExchangers 同胞寻求帮助 所以 我正在尝试构建以下案例 Case 1 A User属于一个或多个Group and a Group可以有很多Permi
  • 如何在 Node.js 中使用 Winston 将日志存储到 mysql 数据库

    我正在使用 winston 为我的应用程序进行日志记录 我已经使用这个完成了文件传输 class LoggerHelper extends BaseHelper constructor cApp super cApp this props
  • WooCommerce:检查商品是否已在购物车中

    我从中发现了这个很棒的片段website https joebuckle me quickie woocommerce check if item already in cart 以下是检查购物车中是否存在特定产品的函数 function
  • PHP 5.4 PDO 无法使用旧的不安全身份验证连接到 MySQL 4.1+

    我知道有很多类似的问题 事实上我已经阅读了所有 9 个问题 但是 他们都没有解决我的问题 我有一个共享托管包 最低限度 我的包中包含域名和托管 MySQL 服务器的单独 IP 地址 为了开发 我正在使用http localhost 与 PH
  • PHP $_SERVER['REMOTE_HOST'] 返回 ::1 [重复]

    这个问题在这里已经有答案了 可能的重复 应该 ip SERVER REMOTE ADDR 在 mamp 本地主机上返回 1 https stackoverflow com questions 3699454 should ip server
  • 如何使用 PHP 通过 JSON 发送 HTML 元素?

    以下功能 try query this gt pdo gt prepare SELECT FROM bookings WHERE TourID AND dTourDate and Status NOT LIKE Cancelled quer
  • 存储过程函数中的动态表名

    我编写了一个存储过程函数来从表中获取名称 问题是我希望将表名作为参数传入 有几个不同的表我需要使用此函数 DELIMITER CREATE DEFINER root localhost FUNCTION getName tableName
  • MySQL LAST_INSERT_ID() 和 FOUND_ROWS()

    当 PHP 脚本每秒有数百个查询时会发生什么 它会影响这些函数吗 是否保证它们会返回当前脚本中最后一个插入语句中最后插入的 id 它会返回当前脚本中最后一次选择的行数吗 如果同时从另一个脚本进行新的插入或选择 在 FOUND ROWS 的情
  • 如何访问带有美元符号的 PHP 对象属性?

    我有一个 PHP 对象 其属性中有一个美元 符号 如何访问该属性的内容 例子 echo object gt variable Ok echo object gt variable WithDollar Syntax error With 变
  • 在同一服务器上的 2 个子域中安装 2 个 WordPress 时共享用户

    我有 2 个 WordPress 网站 位于 2 个不同的子域中 例如test1 abc com and test2 abc com 这两个网站都激活了 wp require 插件 只有登录用户才能看到该网站 我们想要创建一个系统 如果用户
  • PHP7.1上读取会话数据失败

    分享一个我遇到的问题 现已解决 在我的开发机器上 我使用 PHP 运行 IIS 我升级到 PHP7 突然我的代码不再工作 返回此错误 session start 读取会话数据失败 用户 路径 C WINDOWS temp 看起来像是权限问题
  • 使用 Laravel Socialite 登录 facebook

    然而 我是 Laravel 的新手 我正在遵循以下教程http www codeanchor net blog complete laravel socialite tutorial http www codeanchor net blog
  • snappy wkhtmltopdf 包装器将生成的 html 文件发送到浏览器

    我像鼹鼠一样用谷歌搜索 但找不到正确的方法 我正在使用 WKHTMLTOPDF Wrapper Snappy 创建 PDF 如何将使用generateFromHtml方法生成的pdf直接发送到浏览器 这就是我想做的 header Conte
  • CodeIgniter加入选择为

    我的数据库中有 2 个表需要加入 一张表是 artikelen 表 另一张表是 Collections 表 我目前有 this gt db gt select this gt db gt from collecties this gt db
  • 将sql查询结果写入mysql中的文件

    我正在尝试使用 mysql 将查询结果写入文件 我在一些地方看到了有关 outfile 构造的一些信息 但似乎这只将文件写入正在运行 MySQL 的机器 在本例中是远程机器 即数据库不在我的本地机器上 或者 我还尝试运行查询并从 mysql

随机推荐

  • 滚动画布内容

    我在画布上绘制了一些文本和矩形 package com cavium test views import org eclipse swt SWT import org eclipse swt events PaintEvent import
  • 如何使用 thunk 在react-redux hooks中进行异步调用?

    我开始学习钩子 但我不明白异步调用如何正确工作 早些时候我用过 import as actionQR from actions qr function mapDispatchToProps dispatch return actionQR
  • 在asp.net core 2.1中捕获服务器端的会话超时

    我需要做点什么会议结束事件 我怎样才能参加这个活动 与此事件类似的任何事情可能会超时 ASP NET 有一个Session OnEnd您可以在 Global asax 中注册事件 但即使如此 它也非常不可靠 您只能将它用于进程内会话 并且它
  • 如何访问Azure Service Fabric有状态/无状态服务中的settings.xml?

    如何访问和读取中定义的参数PackageRoot Settings Settings xml来自我的有状态 无状态服务代码的文件 例如 我有一个带有参数 EndpointUrl 的 DocumentDbConfig 部分 section s
  • 显示成功消息,然后在超时后使用 PageFlow 重定向到另一个页面

    如何显示成功消息 然后在超时后将用户重定向到另一个页面 例如5秒 成功登录后我需要这个作为登录页面 我尝试了以下操作 我可以看到登录失败时的警告消息 但看不到登录成功时的成功消息 它立即显示目标页面 public String check
  • Amazon EC2丢失私钥,如何访问服务器? [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 前天我的电脑被偷了 我把我的一台服务器私钥放进去 该密钥受密码保护 所以应该没问题 但问题是现在我无法访问服务器 服务器是Ubuntu 亚马逊EC2
  • 管理到非管理开销

    在 NET 中 有几个地方必须离开托管代码并进入非托管 也称为本机代码 领域 仅举几例 外部 DLL 函数 COM调用 总是有一些关于开销的评论从一个原因跳到另一个原因 我的问题是是否有人测量了正在发生的确切开销 并可以解释如何计算它 例如
  • 是否可以将 Azure 虚拟机移动到另一个区域?

    我有一个带有非托管磁盘的 Azure VM 我想把它移到另一个地区 除了概括我当前的虚拟机之外还有其他方法吗 除了概括我当前的虚拟机之外还有其他方法吗 Azure 不支持更改 VM 的位置 您需要将 VM 的 VHD 复制到另一个位置并使用
  • 如何加载本地json文件?

    有没有办法使用 about config 配置 Firefox 以允许本地文件访问 用于演示目的 特别是使用 FF12 我需要能够对 json 数据进行本地文件访问 它在服务器上运行良好 但我想让这个演示更加便携 ajax url asse
  • 如何查看 Android 设备的屏幕状态?

    有没有办法在没有广播接收器的情况下知道Android设备屏幕是否打开 我想通过警报管理器调用的服务在设备上进行分钟间隔更新 我还想延长电池寿命 因此 如果设备屏幕打开 更新服务就会运行 我用这段代码找到了解决我的问题的方法 PowerMan
  • os.fork 和 multiprocessing.Process 之间的行为差​​异

    我有这个代码 import os pid os fork if pid 0 os environ HOME rep1 external function else os environ HOME rep2 external function
  • 驱动器文件更新错误 500

    我的应用程序在 appdata 文件夹中保留了一些应用程序特定文件 但是 当文件尝试更新云端硬盘应用程序数据中的文件时 反复从云端硬盘服务器收到内部错误 我正在使用 Objective c 客户端调用 Drive API 你能帮忙看看这些有
  • 如何区分“使用鼠标右键单击”和“在物理键盘上按上下文菜单键”

    如何区分使用鼠标右键单击和物理键盘上的上下文菜单按键 使用此代码我尝试在控制台中打印事件 inputId bind contextmenu function e console log e 我抓取了上面代码的一些输出 对于使用鼠标右键单击
  • 为所有浏览器嵌入 Windows Media Player

    Edit 这个问题是2008年写的 相当于3个互联网时代之前的事了 如果这个问题仍然与您的环境相关 请接受我的哀悼 其他人都应该转换成一种格式您的浏览器支持 https videojs com html5 video support 如果需
  • Mysql2::Error: key 'index_admin_users_on_email' 的重复条目 '' Ruby on Rails 错误

    我正在尝试在从github获得的rails代码上运行ruby 最后我使用homebrew安装了mysql 然后也直接从http dev mysql com http dev mysql com 直到那时 当我在应用程序文件中使用 rake
  • 垃圾收集在内部 Map 中跟踪其自身实例的对象

    在我的类的构造函数中 我映射当前对象 this 连同它的键 在构造函数中作为参数输入的字符串 一起放入静态 LinkedHashMap 中 这样我就可以在以后可能需要的任何地方通过该字符串引用该对象 这是代码 如果有帮助的话 public
  • 我的API函数应该采用shared_ptr还是weak_ptr

    我目前正在设计一个 API 我不确定我的函数是否应该采用shared ptr or weak ptr 有些小部件包含查看器 观众有一个功能add painter这为观看者添加了一位画家 当查看器需要重绘时 它使用其绘制器绘制到缓冲区并显示结
  • IE 11 Bug - 表单内标签内的图像

    在 IE11 中 以下代码将按预期检查单选按钮
  • 由于上下文丢失,WebGL 场景无法渲染

    我有一个带纹理和不带纹理的道路 3D 模型 当我加载没有纹理的道路时 一切正常 60fps 但是当我加载带有纹理的道路时 有两种变体 1 如果 3D 模型不大 那么它可以加载并工作 但 fps 非常低 10 20 2 如果 3D 模型很大
  • PDO 语句比 MySQL CLI 花费的时间长 400 倍 [重复]

    这个问题在这里已经有答案了 我正在运行一个 PDO 准备语句来从大约 6k 行的表中进行选择 由于 WHERE 语句具有约 5k pId 因此该特定查询最终返回所有行 该表在 pId 列上也有一个索引 SELECT FROM table a