MySql查询保持运行很长时间

时间:2014-04-23 08:00:42

标签: mysql sql query-performance

以下查询继续运行很长时间我在Windows上的XAMPP上使用MySql 5.5.34

SELECT 
      id_package, 
      pck.fk_sales_order, 
      pck.fk_picklist, 
      count(pci.id_package_item) as items, 
      pcs.status, 
      pcs.status_changed_at, 
      so.order_nr, 
      pkli.* 
   FROM 
      oms_package AS pck
         INNER JOIN oms_package_status AS pcs 
            ON pck.id_package = pcs.fk_package 
            AND pcs.is_current = 1
         INNER JOIN ims_sales_order AS so 
            ON pck.fk_sales_order = so.id_sales_order
         LEFT JOIN oms_package_item AS pci 
            ON pck.id_package = pci.fk_package 
            LEFT JOIN wms_picklist_item AS pkli 
               ON pci.fk_sales_order_item = pkli.fk_sales_order_item
              AND pci.fk_inventory  = pkli.fk_inventory
              AND pkli.fk_picklist_item_status = 5 
   WHERE 
          (    pck.isdeleted = 0 
            OR pck.isdeleted IS NULL ) 
      AND pci.isdeleted = 0
   GROUP BY 
      pck.id_package 
   ORDER BY 
      status_updated_at desc 
   LIMIT 
      20

此查询在Linux上运行,大约需要2分钟才能显示结果,但在我的Windows计算机上,它会持续运行2小时而不会产生任何结果。

可能是什么问题?是查询还是本地服务器?

以下是表格中的记录计数

oms_package - 181878,

oms_package_status - 718650,

ims_sales_order - 228907,

oms_package_item - 306966,

wms_picklist_item - 322947

这是EXPLAIN的结果 enter image description here

2 个答案:

答案 0 :(得分:1)

没有单一的银弹来解决这个问题。

步骤1:我建议执行以下步骤并检查性能: 分析表oms_package;

分析表oms_package_status;

分析表ims_sales_order;

分析表oms_package_item;

分析表wms_picklist_item;

步骤2:请检查系统中的资源(CPU,RAM,磁盘IO)使用情况。由于资源问题,您可能会遇到性能问题。特别是,我建议验证磁盘IOP。

步骤3:我还想确保查询有足够的索引。我无法找出可用的索引,请分享与查询关联的表的ddl脚本。

答案 1 :(得分:1)

为了便于阅读,我通过编辑帖子轻微更新了您的查询。在这样做的同时,它也有助于我更好地看待关系。我还删除了“tic”标记,因为当列或表与“保留字”冲突时,您只需要那些标记,否则只会使查询的可读性变得混乱。

你的“WHERE”子句有一个“and pci.isdeleted = 0”,它会将你的“LEFT JOIN”变为“INNER JOIN”。如果您认为它仍然是左连接,则将“and pci ...”组件移动到查询的左连接部分。

至于索引,我建议你的oms_package表上有一个索引(id_package,isdeleted,fk_sales_order,fk_picklist),所以它是一个覆盖索引,并根据条件和条件优化你的组。

对于oms_package_status表,(is_current,fk_package)上的索引

对于ims_sales_order,索引(id_sales_order,order_nr)

对于oms_package_item,索引(fk_package)

对于wms_picklist_item,索引(fk_picklist_item_status,fk_sales_order_item,fk_inventory)

此外,我建议您可能会遇到笛卡尔结果集,导致查询时间过长...最后一个建议(最后一个选项),尝试添加“STRAIGHT_JOIN”关键字,有很多情况下它的性能有了显着改善。 ..其他时间已经受阻...因此,最后将其作为比较。

选择STRAIGHT_JOIN ...其余查询...