Php 如何加速PDO查询
我有超过5500万行(产品)的产品数据库表(tabl_products),iam使用PDO query显示tabl_products表中的每个产品,因此这里是我的查询表结构并选择查询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
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的方法->加载()
从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