SQL查询需要4分钟以上

时间:2018-05-11 16:08:51

标签: mysql sql

SELECT
    pvl.name_parametre_value_parametre_value_lang,
    pv.id_parametre_value,
    ic.id_combinaison,
    ic.prix_combinaison,
    ic.poid_combinaison,
    ic.actif_combinaison,
    ic.actif_genere,
    pv.actif_value,
    pipv.id_parametre_value as pipv_id_parametre_value
FROM
    ps_imp_combinaison_parametre_value_6 cpv
    LEFT JOIN ps_imp_combinaison_6 ic ON ic.id_combinaison = cpv.id_combinaison
    LEFT JOIN ps_imp_parametre_value pv ON pv.id_parametre_value = cpv.id_parametre_value
    LEFT JOIN ps_imp_parametre_value_lang pvl ON pvl.id_parametre_value = pv.id_parametre_value
    LEFT JOIN ps_imp_parametre p ON p.id_parametre = pv.id_parametre
    LEFT JOIN ps_imp_product_impression_parametre_value pipv ON pipv.id_parametre_value = pv.id_parametre_value and pipv.id_product_impression = 63
WHERE
    p.id_nom_domaine = 6
    AND
    pvl.id_lang_domaine = 18
    AND
    ic.id_product_impression = 63
GROUP BY
    ic.id_combinaison,
    cpv.id_parametre_value
ORDER BY
    ic.id_combinaison,
    p.id_parametre 
LIMIT
    0, 50

以下查询花费了太多时间(超过4分钟)。有没有办法让它更快?

ps_imp_combinaison有97290个lignes ps_imp_combinaison_parametre_value有705595个lignes

3 个答案:

答案 0 :(得分:1)

您的查询包含大量连接,这将总是增加提取信息所需的时间。没有简单的方法来加速你拥有的东西,因为你已经对总结果应用了限制,并且这个限制似乎不容易在之前应用。

减少时间的最佳潜力是查看你所拉动的逻辑,看看你是否可以减少连接数。除此之外,看看你是否可以在加入像这样的子查询之前应用限制:

SELECT * FROM
    (SELECT * FROM table_1 LIMIT 50) as subq
    LEFT JOIN ... 

这可能有助于降低后续连接的复杂性。

答案 1 :(得分:0)

您是否定义了indexes?您肯定需要ps_imp_combinaison表列id_combinaisonps_imp_combinaison_parametre_value表列id_combinaison上的索引,因为这是您可能最大的表的主要连接条件。

然后标准列上的其他索引可能会有所帮助。请记住,有一个指数的权衡;索引越多,插入/更新/删除时间越长,但它们可能使4分钟查询成为4秒查询。

答案 2 :(得分:0)

SELECT
    pvl.name_parametre_value_parametre_value_lang,
    pv.id_parametre_value,

    pipv.id_parametre_value as pipv_id_parametre_value
FROM
    ps_imp_combinaison_parametre_value_6 cpv
    LEFT JOIN ps_imp_combinaison_6 ic ON ic.id_combinaison = cpv.id_combinaison
    LEFT JOIN ps_imp_parametre_value pv ON pv.id_parametre_value = cpv.id_parametre_value
    LEFT JOIN ps_imp_parametre_value_lang pvl ON pvl.id_parametre_value = pv.id_parametre_value
    LEFT JOIN ps_imp_parametre p ON p.id_parametre = pv.id_parametre
    LEFT JOIN ps_imp_product_impression_parametre_value pipv ON pipv.id_parametre_value = pv.id_parametre_value and pipv.id_product_impression = 63
WHERE
    p.id_nom_domaine = 6
    AND
    pvl.id_lang_domaine = 18
    AND
    ic.id_product_impression = 63
GROUP BY
    ic.id_combinaison,
    cpv.id_parametre_value
ORDER BY
    ic.id_combinaison,
    p.id_parametre 
LIMIT
    0, 50