MySQL 查询优化与许多 JOINS 的查询

Posted

技术标签:

【中文标题】MySQL 查询优化与许多 JOINS 的查询【英文标题】:MySQL Query Optimization for query with many JOINS 【发布时间】:2020-07-23 13:54:56 【问题描述】:

我有以下查询需要 5 分钟以上才能执行。 您有什么建议可以优化并运行得更快吗?

SELECT if(ppa.id_product_attribute>0,CONCAT_WS('',ppl.name,' : ',pal.name), ppl.name) as PName, psp.visibility, psp.id_supplier, psp.id_manufacturer, psa.out_of_stock, psp.id_category_default, psp.id_tax_rules_group, if(ppa.id_product_attribute>0,CONCAT_WS('',psp.id_product,'-',ppa.id_product_attribute), psp.id_product) as PKey, if(ptswad.id_tot_switch_attribute_disabled>0 OR psp.active=0,0,1) as PActive, if(ppa.weight>0, psp.weight+ppa.weight, psp.weight) as PWeight, if(ppa.ean13>0, ppa.ean13, psp.ean13) as PBarcode,if(ppa.reference!='', ppa.reference, psp.reference) as PReference, es.s1_supplier_key as PSupplierKey, ep.s1_product_key as S1Key
FROM ps_product psp
LEFT JOIN ps_stock_available psa ON psa.id_product=psp.id_product
LEFT JOIN ps_product_attribute ppa on ppa.id_product=psp.id_product
LEFT JOIN ps_tot_switch_attribute_disabled ptswad on ptswad.id_product_attribute=ppa.id_product_attribute
LEFT JOIN ps_product_lang ppl on ppl.id_product=psp.id_product
LEFT JOIN ps_product_attribute_combination ppac on ppac.id_product_attribute=ppa.id_product_attribute
LEFT JOIN ps_attribute_lang pal on pal.id_attribute=ppac.id_attribute and pal.id_lang=2
LEFT JOIN erp_suppliers es on es.ps_supplier_id=psp.id_supplier
LEFT JOIN erp_products ep on ep.ps_product_id=if(ppa.id_product_attribute>0,CONCAT_WS('',psp.id_product,'-',ppa.id_product_attribute), psp.id_product)
WHERE ppl.id_lang=2 AND ppl.id_shop=1 AND psp.active=1
GROUP BY PKey
LIMIT 500,600

更新 1

主表 (ps_product) 有超过 12.000 条记录

我想如果我可以对查询结构进行任何优化,以及我应该创建哪些索引?

更新 2

在 EXPLAIN 查询下方查找

谢谢

【问题讨论】:

您能否提供有关您的表结构和您正在搜索的数据量的更多信息? 还有EXPLAIN SELECT ... 我刚刚更新了我的第一篇文章,详细解释了 @ChrisEl 你还在寻找解决方案还是放弃了? 【参考方案1】:

最后,我在查询中没有发现任何优化,但我意识到 LIMIT 500,600 与 500,2500 相比需要相同的时间 所以我减少了循环圈,总执行时间也减少了

【讨论】:

以上是关于MySQL 查询优化与许多 JOINS 的查询的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 JOINS 和嵌套 SELECT 优化此 SQL 查询?

Rails/MySQL:使用 LEFT JOINS 的 Group/Distinct 使查询时间加倍/性能降低

如何优化这个 MySql 查询 - 连接 3 个表?

PostgreSQL ActiveRecord查询优化

需要帮助来优化 ORACLE SQL 查询 [关闭]

JOINS 的大型查询中的 SQL 子查询链