以下查询继续运行很长时间我在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的结果
答案 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 ...其余查询...