Jump to content

Edit History

PrestaPaul

PrestaPaul

@AfterGlow93 J'ai essayé de repartir sur une base propre en réimportant mes données table par table (peut-être est-ce long parce que j'oublie des tables ?) Voici un exemple quand j'essaie de charger la liste des produits dans le backoffice. Je suis allé chercher la requête en question:

SELECT SQL_CALC_FOUND_ROWS
    p.`id_product` AS `id_product`,
    p.`reference` AS `reference`,
    sa.`price` AS `price`,
    p.`id_shop_default` AS `id_shop_default`,
    p.`is_virtual` AS `is_virtual`,
    pl.`name` AS `name`,
    pl.`link_rewrite` AS `link_rewrite`,
    sa.`active` AS `active`,
    shop.`name` AS `shopname`,
    image_shop.`id_image` AS `id_image`,
    cl.`name` AS `name_category`,
    0 AS `price_final`,
    pd.`nb_downloadable` AS `nb_downloadable`,
    sav.`quantity` AS `sav_quantity`,
    IF(sav.`quantity` <= 0, 1, 0) AS `badge_danger`
FROM
    `product` p
        LEFT JOIN
    `product_lang` pl ON (pl.`id_product` = p.`id_product`
        AND pl.`id_lang` = 1
        AND pl.`id_shop` = 1)
        LEFT JOIN
    `stock_available` sav ON (sav.`id_product` = p.`id_product`
        AND sav.`id_product_attribute` = 0
        AND sav.id_shop = 1
        AND sav.id_shop_group = 0)
        JOIN
    `product_shop` sa ON (p.`id_product` = sa.`id_product`
        AND sa.id_shop = 1)
        LEFT JOIN
    `category_lang` cl ON (sa.`id_category_default` = cl.`id_category`
        AND cl.`id_lang` = 1
        AND cl.id_shop = 1)
        LEFT JOIN
    `category` c ON (c.`id_category` = cl.`id_category`)
        LEFT JOIN
    `shop` shop ON (shop.id_shop = 1)
        LEFT JOIN
    `image_shop` image_shop ON (image_shop.`id_product` = p.`id_product`
        AND image_shop.`cover` = 1
        AND image_shop.id_shop = 1)
        LEFT JOIN
    `image` i ON (i.`id_image` = image_shop.`id_image`)
        LEFT JOIN
    `product_download` pd ON (pd.`id_product` = p.`id_product`)
WHERE
    (1 AND state = 1)
ORDER BY `id_product` DESC
LIMIT 0 , 20

Voici le résultat du EXPLAIN:

explain.thumb.png.9d06f489410d93002adf2a64f5c3e03b.png

La requête met 85 secondes à retourner les 20 résultats attendus 😅 (et quand j'essaie de charger une fiche produit avec le module cross sells, je me prends un 504 gateway, la requête fait fait des jointures entre order_detail, product, product_shop, product_attribute, product_attribute_shop, stock_available, product_lang category_lang, image et il y a un where sur 4000 order_id 🤣 ; quand j'enlève le module cross sells j'ai plus de problème)

Une idée ? 👀

Edit: Quand je retire les lignes qui font des jointures sur image et image_shop, la requête s'exécute en 0,015 secondes 🤔 J'ai vérifié, mais les indexes existent bien sur les tables concernées...

PrestaPaul

PrestaPaul

@AfterGlow93 J'ai essayé de repartir sur une base propre en réimportant mes données table par table (peut-être est-ce long parce que j'oublie des tables ?) Voici un exemple quand j'essaie de charger la liste des produits dans le backoffice. Je suis allé chercher la requête en question:

SELECT SQL_CALC_FOUND_ROWS
    p.`id_product` AS `id_product`,
    p.`reference` AS `reference`,
    sa.`price` AS `price`,
    p.`id_shop_default` AS `id_shop_default`,
    p.`is_virtual` AS `is_virtual`,
    pl.`name` AS `name`,
    pl.`link_rewrite` AS `link_rewrite`,
    sa.`active` AS `active`,
    shop.`name` AS `shopname`,
    image_shop.`id_image` AS `id_image`,
    cl.`name` AS `name_category`,
    0 AS `price_final`,
    pd.`nb_downloadable` AS `nb_downloadable`,
    sav.`quantity` AS `sav_quantity`,
    IF(sav.`quantity` <= 0, 1, 0) AS `badge_danger`
FROM
    `product` p
        LEFT JOIN
    `product_lang` pl ON (pl.`id_product` = p.`id_product`
        AND pl.`id_lang` = 1
        AND pl.`id_shop` = 1)
        LEFT JOIN
    `stock_available` sav ON (sav.`id_product` = p.`id_product`
        AND sav.`id_product_attribute` = 0
        AND sav.id_shop = 1
        AND sav.id_shop_group = 0)
        JOIN
    `product_shop` sa ON (p.`id_product` = sa.`id_product`
        AND sa.id_shop = 1)
        LEFT JOIN
    `category_lang` cl ON (sa.`id_category_default` = cl.`id_category`
        AND cl.`id_lang` = 1
        AND cl.id_shop = 1)
        LEFT JOIN
    `category` c ON (c.`id_category` = cl.`id_category`)
        LEFT JOIN
    `shop` shop ON (shop.id_shop = 1)
        LEFT JOIN
    `image_shop` image_shop ON (image_shop.`id_product` = p.`id_product`
        AND image_shop.`cover` = 1
        AND image_shop.id_shop = 1)
        LEFT JOIN
    `image` i ON (i.`id_image` = image_shop.`id_image`)
        LEFT JOIN
    `product_download` pd ON (pd.`id_product` = p.`id_product`)
WHERE
    (1 AND state = 1)
ORDER BY `id_product` DESC
LIMIT 0 , 20

Voici le résultat du EXPLAIN:

explain.thumb.png.9d06f489410d93002adf2a64f5c3e03b.png

La requête met 85 secondes à retourner les 20 résultats attendus 😅 (et quand j'essaie de charger une fiche produit avec le module cross sells, je me prends un 504 gateway, la requête fait fait des jointures entre order_detail, product, product_shop, product_attribute, product_attribute_shop, stock_available, product_lang category_lang, image et il y a un where sur 4000 order_id 🤣 ; quand j'enlève le module cross sells j'ai plus de problème)

Une idée ? 👀

Edit: Quand je retire les lignes qui font des jointures sur image et image_shop, la requête s'exécute en 0,015 secondes 🤔

PrestaPaul

PrestaPaul

@AfterGlow93 J'ai essayé de repartir sur une base propre en réimportant mes données table par table (peut-être est-ce long parce que j'oublie des tables ?) Voici un exemple quand j'essaie de charger la liste des produits dans le backoffice. Je suis allé chercher la requête en question:

SELECT SQL_CALC_FOUND_ROWS
    p.`id_product` AS `id_product`,
    p.`reference` AS `reference`,
    sa.`price` AS `price`,
    p.`id_shop_default` AS `id_shop_default`,
    p.`is_virtual` AS `is_virtual`,
    pl.`name` AS `name`,
    pl.`link_rewrite` AS `link_rewrite`,
    sa.`active` AS `active`,
    shop.`name` AS `shopname`,
    image_shop.`id_image` AS `id_image`,
    cl.`name` AS `name_category`,
    0 AS `price_final`,
    pd.`nb_downloadable` AS `nb_downloadable`,
    sav.`quantity` AS `sav_quantity`,
    IF(sav.`quantity` <= 0, 1, 0) AS `badge_danger`
FROM
    `product` p
        LEFT JOIN
    `product_lang` pl ON (pl.`id_product` = p.`id_product`
        AND pl.`id_lang` = 1
        AND pl.`id_shop` = 1)
        LEFT JOIN
    `stock_available` sav ON (sav.`id_product` = p.`id_product`
        AND sav.`id_product_attribute` = 0
        AND sav.id_shop = 1
        AND sav.id_shop_group = 0)
        JOIN
    `product_shop` sa ON (p.`id_product` = sa.`id_product`
        AND sa.id_shop = 1)
        LEFT JOIN
    `category_lang` cl ON (sa.`id_category_default` = cl.`id_category`
        AND cl.`id_lang` = 1
        AND cl.id_shop = 1)
        LEFT JOIN
    `category` c ON (c.`id_category` = cl.`id_category`)
        LEFT JOIN
    `shop` shop ON (shop.id_shop = 1)
        LEFT JOIN
    `image_shop` image_shop ON (image_shop.`id_product` = p.`id_product`
        AND image_shop.`cover` = 1
        AND image_shop.id_shop = 1)
        LEFT JOIN
    `image` i ON (i.`id_image` = image_shop.`id_image`)
        LEFT JOIN
    `product_download` pd ON (pd.`id_product` = p.`id_product`)
WHERE
    (1 AND state = 1)
ORDER BY `id_product` DESC
LIMIT 0 , 20

Voici le résultat du EXPLAIN:

explain.thumb.png.9d06f489410d93002adf2a64f5c3e03b.png

La requête met 85 secondes à retourner les 20 résultats attendus 😅 (et quand j'essaie de charger une fiche produit avec le module cross sells, je me prends un 504 gateway, la requête fait fait des jointures entre order_detail, product, product_shop, product_attribute, product_attribute_shop, stock_available, product_lang category_lang, image et il y a un where sur 4000 order_id 🤣 ; quand j'enlève le module cross sells j'ai plus de problème)

Une idée ? 👀

×
×
  • Create New...