【问题标题】:MySQL Query is so slow it's take over 500 sec, any other suggestionsMySQL Query 太慢了,需要超过 500 秒,任何其他建议
【发布时间】:2013-12-30 18:47:25
【问题描述】:
SELECT `mi`.`Item_Description` AS `Item_Description`,
       `psi`.`Item_ID` AS `Item_ID`,
       `mt`.`Type_Description` AS `Type_Description`,
       `psi`.`Item_Type_Id` AS `Item_Type_Id`,
       `psi`.`Item_Unit` AS `Item_Unit`,
       (Select Sum(Item_Quantity_Delivered) From project_store_input Where Item_ID = psi.Item_Id) AS `Total_Input`,
       (Select Sum(Output_Quantity) From project_store_output Where Item_Id = psi.Item_Id) as Total_Output,
       ((Select Sum(Item_Quantity_Delivered) From project_store_input Where Item_ID = psi.Item_Id) - (Select Sum(Output_Quantity) From project_store_output Where Item_Id = psi.Item_Id)) as Balance

FROM (`project_store_input` `psi`
     LEFT JOIN `materials_items` `mi` on(`mi`.`Item_ID` = `psi`.`Item_ID`)
     LEFT JOIN `materials_types` `mt` on(`mt`.`Type_ID` = `psi`.`Item_Type_Id`)
     LEFT JOIN `suppliers` `s` on(`s`.`Supplier_ID` = `psi`.`Supplier_ID`)
     LEFT JOIN `project_store_output` as `pso` on (pso.Item_Id = psi.Item_ID))
GROUP BY `psi`.`Item_ID`

此 SQL 查询是从两个表“project_store_input”和“project_store_output”计算余额,结果应该浏览(项目名称、项目 ID、Total_Input、Total_Output、Balance)

请有任何建议, 提前谢谢...

【问题讨论】:

  • GROUP BY 有什么用?
  • 确保您已在要选择的每个字段中创建索引
  • 另外,您没有以任何方式选择或过滤 pso 或供应商,那么为什么要包括它们呢?
  • 如果它在 select 的同一个表上,为什么要使用子查询来进行求和?不需要,把sum和group by 其他不在sum上的字段就行了。
  • 请发表解释。

标签: mysql sql performance select query-optimization


【解决方案1】:

无需编写子查询。您可以直接添加数量。

试试这个:

SELECT mi.Item_Description AS Item_Description,
       psi.Item_ID AS Item_ID,
       mt.Type_Description AS Type_Description,
       psi.Item_Type_Id AS Item_Type_Id,
       psi.Item_Unit AS Item_Unit,
       psi1.DeliveredQty AS Total_Input,
       pso1.OutputQty AS Total_Output,
       (IFNULL(psi1.DeliveredQty, 0) - IFNULL(pso1.OutputQty, 0)) AS Balance
FROM project_store_input psi
LEFT JOIN materials_items mi ON mi.Item_ID = psi.Item_ID
LEFT JOIN materials_types mt ON mt.Type_ID = psi.Item_Type_Id
LEFT JOIN suppliers s ON s.Supplier_ID = psi.Supplier_ID
LEFT JOIN project_store_output AS pso ON pso.Item_Id = psi.Item_ID
LEFT JOIN (SELECT Item_ID, SUM(Item_Quantity_Delivered) DeliveredQty FROM project_store_input GROUP BY Item_ID) psi1 ON psi.Item_ID = psi.Item_Id 
LEFT JOIN (SELECT Item_Id, SUM(Output_Quantity) OutputQty FROM project_store_output GROUP BY Item_Id) pso1 ON psi.Item_Id = pso1.Item_Id
GROUP BY BY psi.Item_ID

SELECT mi.Item_Description AS Item_Description,
       psi.Item_ID AS Item_ID,
       mt.Type_Description AS Type_Description,
       psi.Item_Type_Id AS Item_Type_Id,
       psi.Item_Unit AS Item_Unit,
       SUM(Item_Quantity_Delivered) AS Total_Input,
       SUM(Output_Quantity) AS Total_Output,
       (SUM(Item_Quantity_Delivered) - SUM(Output_Quantity)) AS Balance
FROM project_store_input psi
LEFT JOIN materials_items mi ON mi.Item_ID = psi.Item_ID
LEFT JOIN materials_types mt ON mt.Type_ID = psi.Item_Type_Id
LEFT JOIN suppliers s ON s.Supplier_ID = psi.Supplier_ID
LEFT JOIN project_store_output AS pso ON pso.Item_Id = psi.Item_ID
GROUP BY BY psi.Item_ID

【讨论】:

    【解决方案2】:

    试试这个方法。您正在执行不必要的子查询。

    SELECT `mi`.`Item_Description` AS `Item_Description`,
           `psi`.`Item_ID` AS `Item_ID`,
           `mt`.`Type_Description` AS `Type_Description`,
           `psi`.`Item_Type_Id` AS `Item_Type_Id`,
           `psi`.`Item_Unit` AS `Item_Unit`,
           Sum(Item_Quantity_Delivered) AS `Total_Input`,
           Sum(Output_Quantity) as Total_Output,
           (Sum(Item_Quantity_Delivered) - Sum(Output_Quantity)) as Balance
    FROM `project_store_input` `psi`
         LEFT JOIN `materials_items` `mi` on(`mi`.`Item_ID` = `psi`.`Item_ID`)
         LEFT JOIN `materials_types` `mt` on(`mt`.`Type_ID` = `psi`.`Item_Type_Id`)
         LEFT JOIN `suppliers` `s` on(`s`.`Supplier_ID` = `psi`.`Supplier_ID`)
         LEFT JOIN `project_store_output` as `pso` on (pso.Item_Id = psi.Item_ID)
    GROUP BY `mi`.`Item_Description`,
             `psi`.`Item_ID`,
             `mt`.`Type_Description`,
             `psi`.`Item_Type_Id`,
             `psi`.`Item_Unit`
    

    【讨论】:

    • 这样我无法得到每个项目的总数
    • 然后按psi.Item_ID分组
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-08
    • 1970-01-01
    相关资源
    最近更新 更多