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-为这些列编制索引?似乎会显著减慢速度的列实际上只是数量列,它与任何其他表都没有关系。它只存储在该表中。@JordiePuchinger
quantity
列应该不会对您的性能产生影响(除非它用于容纳大水滴);这是您在WHERE子句中使用的条件(以及所涉及的数据类型)。@uuerdo My QUANTITY列为十进制(11,0)。所有的GUID列都是文本,但我将它们转换为CHAR(40)-您对此有何想法?虽然我熟悉SQL,但我认为自己是定义数据类型的初学者。@ JordiePuchinger任何类型的字符串值都不适合用作键或连接条件,或者甚至在不试图回答诸如“名为“约翰”的用户或“以j开头的用户”的条件下。但是在这种情况下,CHAR比TEXT好,如果我匹配两个表之间的GUID,比如说,两个表之间的UNIT_GUID,为这些列编制索引,那么看起来速度明显减慢的列实际上只是数量列,它与任何其他表都没有关系。它只存储在该表中。@JordiePuchinger
quantity
列应该不会对您的性能产生影响(除非它用于容纳大水滴);这是您在WHERE子句中使用的条件(以及所涉及的数据类型)。@uuerdo My QUANTITY列为十进制(11,0)。所有的GUID列都是文本,但我将它们转换为CHAR(40)-您对此有何想法?虽然我熟悉SQL,但我认为自己是定义数据类型的初学者。@ JordiePuchinger任何类型的字符串值都不适合用作键或连接条件,或者甚至在条件为n的情况下使用。