Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/291.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何加速PDO查询_Php_Mysql_Performance_Pdo - Fatal编程技术网

Php 如何加速PDO查询

Php 如何加速PDO查询,php,mysql,performance,pdo,Php,Mysql,Performance,Pdo,我有超过5500万行(产品)的产品数据库表(tabl_products),iam使用PDO query显示tabl_products表中的每个产品,因此这里是我的查询表结构并选择查询 id | pr_name | pr_description | pr_qntty | pr_price $pr_id = (int)$_GET['id']; $select_pr = $con->prepare("SELECT pr_name, pr_description, pr_price FROM

我有超过5500万行(产品)的产品数据库表(tabl_products),iam使用PDO query显示tabl_products表中的每个产品,因此这里是我的查询表结构并选择查询

id | pr_name | pr_description | pr_qntty | pr_price

$pr_id = (int)$_GET['id'];
$select_pr = $con->prepare("SELECT pr_name, pr_description, pr_price FROM tabl_products WHERE id=:pr_id");
$select_pr->bindParam(":pr_id", $pr_id);
$select_pr->execute();
if(!($select_pr->rowCount()))
{
   include '404.php'; exit();
}
$fetch_pr = $select_pr->fetch(PDO::FETCH_ASSOC);

echo $pr_name = $fetch_pr['pr_name'].'<br/>';
echo $pr_description = $pr_description['pr_description'].'<br/>';
echo $pr_price = $fetch_all['pr_price'];

由于您的
id
是唯一的(主键),您可以添加
LIMIT 1
。因为,否则,即使您的产品只找到一次,PDO也会继续查找具有该特定id的其他产品

因此,您的查询变成:

SELECT pr_name, pr_description, pr_price FROM tabl_products WHERE id=:pr_id LIMIT 1
试着告诉我们需要多长时间:)

PS:它被ORM使用,例如:

  • 第195行,参数$load位于位置6,共
  • 使用BasicEntityPersister的方法->加载()

我使用MySQL 5.7.20重新创建了类似的数据库,用伪数据填充了大约55000000行,并进行如下查询:

从stackoverflow_test.tabl_products中选择*,其中id=12345678

在我的(像样的)PC上快速返回结果(在MYSQL工作台中显示0.000s)

我可以给你一些想法,让你找出问题所在。首先,代码中有一些bug

echo$pr_name=$fetch_pr['pr_name']。
; echo$pr_description=$pr_description['pr_description']。
; echo$pr_price=$fetch_all['pr_price'];
$pr\u description
应替换为
$fetch\u pr

$fetch\u all
应替换为
$fetch\u pr

也许您的php文件中还有其他东西使得执行速度如此之慢。尝试执行最小文件,或使用MySQL Workbench(或类似工具)确保这不是http服务器或php的问题(可能查询运行速度快,但获取速度慢,或者存在其他问题?)

尤其是对于如此大的数据库,您需要确保使用索引。在MySQL中,您可以通过在查询前添加
EXPLAIN
()来实现这一点,即:

EXPLAIN SELECT*来自stackoverflow_test.tabl_products,其中id=12345678

然后分析字段可能的\u键,它们应该包括索引的名称(主索引)。如果MySQL没有使用索引,那么在查询中添加
USE index(`PRIMARY`)
()语句应该会有所帮助,但您应该调查为什么默认情况下不使用它

仅供参考当我添加
ignoreindex(`PRIMARY`)
只是为了检查没有索引的查询执行时间时,查询运行大约30秒,而不是几分之一秒

这也可能是因为服务器过载或电量不足,但使用索引时,您的查询速度应该非常快


用户建议,即使使用索引,它也可能太大,无法放入内存,所以从磁盘读取,速度很慢。您可能需要检查索引的大小,并将其与可用内存进行比较,并(如果需要)相应地调整MySQL内存设置。

是否索引了
id
列?id column是自动递增的,它是主键表中有多少行?确切地说,表中有55090297行是一个完整的猜测,但是,如果您运行的是CPanel,我想知道您是否只是在一个共享服务器上,它要么被过度订阅,要么严重缺乏规范?您好,为什么您认为这毫无意义?你能发展一下吗?您是否尝试过在5500万对象表上使用和不使用限制1?谢谢,这毫无意义,因为MySQL的查询计划器已经在内部完成了这项工作。知道
唯一的
键的含义就足够聪明了。瞧,我想你找错人了。解释不会给你任何线索。数据库服务器上的innodb stats和内存状态将显示索引是否用于此特定查询。如果是,你可以做进一步的调查,但如果不是,你可以“鼓励”MySQL将索引与使用索引一起使用(并调查为什么默认情况下不使用索引)。我知道我的答案不是问题的完整解决方案,但它可以消除一些可能的原因是的,与另一个不同,就其本身而言,这是一个很好的答案,它可能会帮助其他人。但在这种特殊情况下,很难相信没有使用主键。很可能没有足够的内存用于索引。我同意这样的查询看起来不太可能。如果你不介意的话,我将把你的建议包括在我的回答中。
SELECT pr_name, pr_description, pr_price FROM tabl_products WHERE id=:pr_id LIMIT 1