首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PDO语句比MySQL CLI长400倍

PDO语句比MySQL CLI长400倍
EN

Stack Overflow用户
提问于 2018-05-16 16:26:24
回答 1查看 179关注 0票数 3

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

代码语言:javascript
复制
SELECT * FROM table_a WHERE pId in (?, ? ,? ....)

此查询在php中运行需要4.5秒,在MySQL CLI中运行时需要.01秒。PHP语句和MySQL语句是相同的,它们都是,而不是使用pId索引的。我认为这是因为MySQL知道它正在返回整个表,而不需要使用索引。

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

PHP版本: 5.5

MySql版本: 5.6

EN

回答 1

Stack Overflow用户

发布于 2018-05-16 20:35:38

我怀疑慢的地方是获取行,返回的行数,而不是语句中的5000+绑定占位符。pId IN ( ? , ? , ... , ? )

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

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

代码语言:javascript
复制
 ... pId IN ( ? , ? , ? , ... , ? )

所以结果相当于运行

代码语言:javascript
复制
 ... pId IN ( 99999999 , 99999998 , 99999997 , ... , 42 )

这将是相同的结果,我们将运行

代码语言:javascript
复制
 ... pId IN ( 42 )

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

然后将该值(返回1行的5000+绑定值)与返回单行的两个绑定值进行比较。

代码语言:javascript
复制
 ... pId IN ( 99999999 , 42 )

看看在性能上是否有显著的差异。

(关于5000+绑定值还有更多的工作要做,但我不认为会有很大的差别,但应该进行测试。

考虑到这一点,使用所有现有的绑定值来设置测试并将LIMIT 2添加到查询末尾可能更容易。(我不确定MySQL是否对LIMIT 2有一些性能改进。

最好添加一个像AND pId * 10 = 420这样的条件

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

另一个测试是返回一系列行,但只使用几个绑定值。可能是返回5000+行的范围条件。

查询可以是:

代码语言:javascript
复制
 ... pId >= ? AND pId <= ? 

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

比较一下表现。

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50375815

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档