SQL-запрос занимает более 4 минут - PullRequest
0 голосов
/ 11 мая 2018
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 линьей, ps_imp_combinaison_parametre_value имеет 705595 линьев

Ответы [ 3 ]

0 голосов
/ 11 мая 2018

Есть ли у вас индексы , определенные? Вам определенно понадобится индекс для ps_imp_combinaison столбца таблицы id_combinaison и для ps_imp_combinaison_parametre_value столбца таблицы id_combinaison, так как это основной критерий соединения в ваших предположительно самых больших таблицах.

Тогда могут быть полезны дополнительные индексы в столбцах критериев. Просто помните, что есть компромисс между индексами; чем больше индексов, тем дольше выполняется вставка / обновление / удаление, но они могут сделать этот 4-минутный запрос, вероятно, 4-секундным.

0 голосов
/ 19 сентября 2018
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
0 голосов
/ 11 мая 2018

Ваш запрос содержит много объединений, что всегда увеличивает время, необходимое для извлечения информации.Нет простого способа ускорить то, что у вас есть, поскольку вы уже применяете лимит к общему результату, и этот предел не может быть легко применен ранее.

Ваш лучший потенциал для сокращения времени - это посмотреть на логику того, что вы тянете, и посмотреть, сможете ли вы уменьшить количество соединений.Кроме того, посмотрите, можете ли вы применить ограничение перед объединением с подзапросом, подобным следующему:

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

Это может помочь уменьшить сложность последующих объединений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...