Jump to content

Ver productos en el backoffice muy lento


Recommended Posts

Tengo proestashop 1.6.1.4, instalación limpia. Con 20500 productos a la fecha, cerca de 200 categorías. Estaba trabajando muy bien en un servidor Xeon Cuad Core, con 8Gb de Ram. Sin embargo después de importar las imágenes de los 20500 productos al tratar de verlos en el backoffice toma hasta 5 minutos en desplegar la página de vista de productos (en el front se despliegan bien y sin problema)


 


Según el debug, la consulta que consume más tiempo es la siguiente, generando 230millones de filas: 



SELECT SQL_NO_CACHE COUNT(*) AS `ps_product`
FROM `ps_product` a
LEFT JOIN `ps_product_lang` b ON (b.`id_product` = a.`id_product` AND b.`id_lang` = 1 AND b.`id_shop` = 1)
LEFT JOIN `ps_stock_available` sav ON (sav.`id_product` = a.`id_product` AND sav.`id_product_attribute` = 0
AND sav.id_shop = 1 AND sav.id_shop_group = 0 ) JOIN `ps_product_shop` sa ON (a.`id_product` = sa.`id_product` AND sa.id_shop = a.id_shop_default)
LEFT JOIN `ps_category_lang` cl ON (sa.`id_category_default` = cl.`id_category` AND b.`id_lang` = cl.`id_lang` AND cl.id_shop = a.id_shop_default)
LEFT JOIN `ps_shop` shop ON (shop.id_shop = a.id_shop_default)
LEFT JOIN `ps_image_shop` image_shop ON (image_shop.`id_product` = a.`id_product` AND image_shop.`cover` = 1 AND image_shop.id_shop = a.id_shop_default)
LEFT JOIN `ps_image` i ON (i.`id_image` = image_shop.`id_image`)
LEFT JOIN `ps_product_download` pd ON (pd.`id_product` = a.`id_product`)
WHERE 1 LIMIT 1

La consulta se ubica en el archivo /controllers/admin/AdminProductsController.php sin embargo, no consigo optimizarla... alguien tendrá alguna idea?


 


Alex.


Link to comment
Share on other sites

¿Un xeon con 8GB de RAM para un prestashop?

¿Cúantos visitantes simultaneos tienes? Porque considero que estás desperdiciando recursos.

 

Como consejo, la potencia sin control no sirve de nada, puedes tener un gran servidor que si no está bien configurado podrás experimentar problemas de carga (entre otros) aún teniendo un gran equipo.

 

Si no me equivoco con el cambio que te pusieron arriba, puede ser que mysql te muestre tablas cacheadas.. no sé si es lo que buscas o no.

Link to comment
Share on other sites

Hola a todos, he probado las 2 soluciones que ha propuesto, sin embargo, sigo teniendo el problema con el listado de productos... lo que me deja de interrogante es por que se obtiene un gran número de filas en esa consulta (millones) cuando son solo 20mil productos.

Link to comment
Share on other sites

  • 1 year later...

Por si alguien tiene este mismo problema. Les cuento como lo solucioné.

En el archivo mencionado /controllers/admin/AdminProductsController.php

Debajo de la Línea 178.

Hace 3 LEFT JOINs que causan que las consultas se multiplequen (no he investigado bien pr qué), lo que he hecho es reemplazar esa consulta quitando los JOINS innecesarios. Al final lo único que me ha afectado es que no muestra la immagen del producto en el listado del backoffice, pero de ahí en fuera funciona a la perfección y sin tener largos tiempos de carga .

Espero que a alguien le sirva ;)

 

$id_shop = Shop::isFeatureActive() && Shop::getContext() == Shop::CONTEXT_SHOP? (int)$this->context->shop->id : 'a.id_shop_default';
		/*
        $this->_join .= ' JOIN `'._DB_PREFIX_.'product_shop` sa ON (a.`id_product` = sa.`id_product` AND sa.id_shop = '.$id_shop.')
				LEFT JOIN `'._DB_PREFIX_.'category_lang` cl ON ('.$alias.'.`id_category_default` = cl.`id_category` AND b.`id_lang` = cl.`id_lang` AND cl.id_shop = '.$id_shop.')
				LEFT JOIN `'._DB_PREFIX_.'shop` shop ON (shop.id_shop = '.$id_shop.')
				LEFT JOIN `'._DB_PREFIX_.'image_shop` image_shop ON (image_shop.`id_product` = a.`id_product` AND image_shop.`cover` = 1 AND image_shop.id_shop = '.$id_shop.')
				LEFT JOIN `'._DB_PREFIX_.'image` i ON (i.`id_image` = image_shop.`id_image`)
				LEFT JOIN `'._DB_PREFIX_.'product_download` pd ON (pd.`id_product` = a.`id_product` AND pd.`active` = 1)';
		*/
        $this->_join .= ' JOIN `'._DB_PREFIX_.'product_shop` sa ON (a.`id_product` = sa.`id_product` AND sa.id_shop = '.$id_shop.')
				LEFT JOIN `'._DB_PREFIX_.'category_lang` cl ON ('.$alias.'.`id_category_default` = cl.`id_category` AND b.`id_lang` = cl.`id_lang` AND cl.id_shop = '.$id_shop.')
				LEFT JOIN `'._DB_PREFIX_.'shop` shop ON (shop.id_shop = '.$id_shop.')
				LEFT JOIN `'._DB_PREFIX_.'product_download` pd ON (pd.`id_product` = a.`id_product`)';

        $this->_select .= 'shop.`name` AS `shopname`, a.`id_shop_default`, ';
        $this->_select .= ' cl.`name` AS `name_category`, '.$alias.'.`price`, 0 AS `price_final`, a.`is_virtual`, pd.`nb_downloadable`, sav.`quantity` AS `sav_quantity`, '.$alias.'.`active`, IF(sav.`quantity`<=0, 1, 0) AS `badge_danger`';
		/*esta era la línea anterior...
		$this->_select .= ' cl.`name` AS `name_category`, '.$alias.'.`price`, 0 AS `price_final`, a.`is_virtual`, pd.`nb_downloadable`, sav.`quantity` AS `sav_quantity`, '.$alias.'.`active`, IF(sav.`quantity`<=0, 1, 0) AS `badge_danger`';
		*/

 

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...