Php SQL查询运行速度非常慢
我在下面运行的代码运行得非常好,直到我尝试在最后一个循环中获取数量。我认为它可能会通过连接等进行优化,但我不太熟悉在获取不同元素时实现这一点的最佳方法Php SQL查询运行速度非常慢,php,mysql,sql,pdo,Php,Mysql,Sql,Pdo,我在下面运行的代码运行得非常好,直到我尝试在最后一个循环中获取数量。我认为它可能会通过连接等进行优化,但我不太熟悉在获取不同元素时实现这一点的最佳方法 $sql_dept = "SELECT DISTINCT `department_guid` FROM `bom_material_copy` WHERE `complex_guid`='9EB75BE9-26E2-AEBB-1B52-37DBC2FB89EA' ORDER BY `id` DESC LIMIT 0,5"; foreach($p
$sql_dept = "SELECT DISTINCT `department_guid` FROM `bom_material_copy` WHERE `complex_guid`='9EB75BE9-26E2-AEBB-1B52-37DBC2FB89EA' ORDER BY `id` DESC LIMIT 0,5";
foreach($pdo->query($sql_dept) AS $dept)
{
$sql_mat = "SELECT DISTINCT `material_bct_number` FROM `bom_material_copy` WHERE
`complex_guid`='9EB75BE9-26E2-AEBB-1B52-37DBC2FB89EA' AND
`department_guid`='".$dept['department_guid']."'
ORDER BY `id` DESC LIMIT 0,5";
foreach($pdo->query($sql_mat) AS $mat)
{
echo "<tr>";
echo "<td>".$mat['material_bct_number']."</td>";
// Grab Units Again
$u = 0;
$sql_unit = "SELECT DISTINCT `unit_number` FROM `bom_projects_units` WHERE `complex_guid`='9EB75BE9-26E2-AEBB-1B52-37DBC2FB89EA'";
foreach($pdo->query($sql_unit) AS $unit)
{
$sql_quan = "SELECT `quantity` FROM `bom_material_copy`
WHERE
`material_bct_number`='".$mat['material_bct_number']."' AND
`unit_number`='".$unit['unit_number']."' AND
`department_guid`='".$dept['department_guid']."'";
foreach($pdo->query($sql_quan) AS $quan)
{
echo "<td>".$quan['quantity']."</td>";
}
}
echo "</tr>";
}
}
$sql\u dept=“从“bom”材料副本中选择不同的“部门guid”,其中“复杂”guid`='9EB75BE9-26E2-AEBB-1B52-37DBC2FB89EA'订单,按'id'说明限制0,5';
foreach($pdo->query($sql\u dept)作为$dept)
{
$sql\u mat=“从“bom\u材料\u副本”中选择不同的“材料\u bct\u编号”,其中
`复合_guid`=“9EB75BE9-26E2-AEBB-1B52-37DBC2FB89EA”和
`部门guid`=“$dept['department\u guid']”
按'id`DESC LIMIT 0,5'排序的订单;
foreach($pdo->query($sql\u mat)作为$mat)
{
回声“;
回音“$mat[“材料bct编号]”;
//再次抓取单位
$u=0;
$sql\u unit=“从“bom\u项目\u单元”中选择不同的“单元号”,其中“复杂的\u guid”='9EB75BE9-26E2-AEBB-1B52-37DBC2FB89EA';
foreach($pdo->query($sql\u单位)作为$unit)
{
$sql\u quan=“从“物料清单”材料副本中选择“数量”
哪里
`物料编号“=”$mat[“物料编号”]。”和
`单位编号“=”$unit[“单位编号”]。”,以及
`部门guid`=”$dept['department\u guid']。“”;
foreach($pdo->query($sql\u quan)作为$quan)
{
回显“$quan['quantity']”;
}
}
回声“;
}
}
尝试在查询中使用
当您这样做时,您就知道您在查询中使用的表之间的关系
下一步,在要匹配的字段中使用,然后再次执行您的查询。尝试在查询中使用
当您这样做时,您就知道您在查询中使用的表之间的关系
下一步,在要匹配的字段中使用,然后再次执行查询。嵌套查询的性能很高;尝试使用JOINsFurther来减少查询的数量来标记注释,它是一个大型数据库吗?您正在查询的表是否正确索引?它是一个较大的数据库是的。包含数量、ID列和数量列的表都被索引,但仅此而已。您的
LIMIT
子句使将其转换为相当简单的JOIN
变得复杂。你可能还应该定义你所说的“好”是什么意思。我的初步猜测是,您最好的选择是最内层嵌套查询的WHERE
子句中使用的字段上的复合索引。此外,除非绝对必要,否则guid对于MySQL表的主键/引用键是个坏主意。你可以考虑的是使用外部查询生成<代码>临时< /代码>表,然后可以索引并加入最后的查询。是否有人有一个例子,或者能够提供一个例子,说明我如何在这样的查询上进行连接?嵌套查询在性能上是昂贵的;尝试使用JOINsFurther来减少查询的数量来标记注释,它是一个大型数据库吗?您正在查询的表是否正确索引?它是一个较大的数据库是的。包含数量、ID列和数量列的表都被索引,但仅此而已。您的LIMIT
子句使将其转换为相当简单的JOIN
变得复杂。你可能还应该定义你所说的“好”是什么意思。我的初步猜测是,您最好的选择是最内层嵌套查询的WHERE
子句中使用的字段上的复合索引。此外,除非绝对必要,否则guid对于MySQL表的主键/引用键是个坏主意。你可以考虑的是使用外部查询生成<代码>临时< /代码>表,然后可以索引并加入最后的查询。有人有一个例子,或者能够提供一个例子,说明我如何在这样的查询中加入一个连接?所以,如果我匹配两个表之间的GUID,并说,两个表之间的单位GUID-为这些列编制索引?似乎会显著减慢速度的列实际上只是数量列,它与任何其他表都没有关系。它只存储在该表中。@JordiePuchingerquantity
列应该不会对您的性能产生影响(除非它用于容纳大水滴);这是您在WHERE子句中使用的条件(以及所涉及的数据类型)。@uuerdo My QUANTITY列为十进制(11,0)。所有的GUID列都是文本,但我将它们转换为CHAR(40)-您对此有何想法?虽然我熟悉SQL,但我认为自己是定义数据类型的初学者。@ JordiePuchinger任何类型的字符串值都不适合用作键或连接条件,或者甚至在不试图回答诸如“名为“约翰”的用户或“以j开头的用户”的条件下。但是在这种情况下,CHAR比TEXT好,如果我匹配两个表之间的GUID,比如说,两个表之间的UNIT_GUID,为这些列编制索引,那么看起来速度明显减慢的列实际上只是数量列,它与任何其他表都没有关系。它只存储在该表中。@JordiePuchingerquantity
列应该不会对您的性能产生影响(除非它用于容纳大水滴);这是您在WHERE子句中使用的条件(以及所涉及的数据类型)。@uuerdo My QUANTITY列为十进制(11,0)。所有的GUID列都是文本,但我将它们转换为CHAR(40)-您对此有何想法?虽然我熟悉SQL,但我认为自己是定义数据类型的初学者。@ JordiePuchinger任何类型的字符串值都不适合用作键或连接条件,或者甚至在条件为n的情况下使用。