Jump to content

Consultas Sql lentas en Prestashop 1.7.6.7


jofefo

Recommended Posts

Buenas tardes,

Analizando el rendimiento de mi web he activado el modo "_PS_DEBUG_PROFILING_" para ver que consultas tardaban más en ejecutarse y me he encontrado una que no se si es normal. 

En el index la siguiente consulta tarda 4.4 ms y devuelve 5138 resultados, no se si es normal que devuelva tantos resultados y tarde tanto.  

SELECT SQL_NO_CACHE c.`name`, cl.`id_lang`, IF(cl.`id_lang` IS NULL, c.`value`, cl.`value`) AS value, c.id_shop_group, c.id_shop
FROM `ps_configuration` c
LEFT JOIN `ps_configuration_lang` cl ON (c.`id_configuration` = cl.`id_configuration`)

 

Y en las categorías la siguiente consulta tarda 11,6 ms y solo devuelve 56 resultados. 

SELECT SQL_NO_CACHE p.*, product_shop.*, stock.out_of_stock, IFNULL(stock.quantity, 0) AS quantity, IFNULL(product_attribute_shop.id_product_attribute, 0) AS id_product_attribute,
product_attribute_shop.minimal_quantity AS product_attribute_minimal_quantity, pl.`description`, pl.`description_short`, pl.`available_now`,
pl.`available_later`, pl.`link_rewrite`, pl.`meta_description`, pl.`meta_keywords`, pl.`meta_title`, pl.`name`, image_shop.`id_image` id_image,
il.`legend` as legend, m.`name` AS manufacturer_name, cl.`name` AS category_default,
DATEDIFF(product_shop.`date_add`, DATE_SUB("2020-07-22 00:00:00",
INTERVAL 40 DAY)) > 0 AS new, product_shop.price AS orderprice
FROM `ps_category_product` cp
LEFT JOIN `ps_product` p
ON p.`id_product` = cp.`id_product`
INNER JOIN ps_product_shop product_shop
ON (product_shop.id_product = p.id_product AND product_shop.id_shop = 1) LEFT JOIN `ps_product_attribute_shop` product_attribute_shop
ON (p.`id_product` = product_attribute_shop.`id_product` AND product_attribute_shop.`default_on` = 1 AND product_attribute_shop.id_shop=1)
LEFT JOIN ps_stock_available stock
ON (stock.id_product = `p`.id_product AND stock.id_product_attribute = 0 AND stock.id_shop_group = 1  AND stock.id_shop = 0  )
LEFT JOIN `ps_category_lang` cl
ON (product_shop.`id_category_default` = cl.`id_category`
AND cl.`id_lang` = 1 AND cl.id_shop = 1 )
LEFT JOIN `ps_product_lang` pl
ON (p.`id_product` = pl.`id_product`
AND pl.`id_lang` = 1 AND pl.id_shop = 1 )
LEFT JOIN `ps_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 `ps_image_lang` il
ON (image_shop.`id_image` = il.`id_image`
AND il.`id_lang` = 1)
LEFT JOIN `ps_manufacturer` m
ON m.`id_manufacturer` = p.`id_manufacturer`
WHERE product_shop.`id_shop` = 1
AND cp.`id_category` = 14 AND product_shop.`active` = 1 AND product_shop.`visibility` IN ("both", "catalog") ORDER BY p.`date_upd` DESC
LIMIT 0,15

 

¿Se puede hacer algo para mejorar estas consultas?

 

Prestashop 1.7.6.7

Multitienda

Tema: ZOneTheme Versión 2.4.8

Link to comment
Share on other sites

Buenas, 

 A mi me tardan como mucho 1 seg, pero devuelven menos resultados, 

La primera tiene pinta de estar asociado a idiomas, si tienes idiomas que no utilizas quizá sea buena opción quitarlos. 

Tiene pinta de que el multi-tienda está haciendo que no vaya lo fluido que tiene que ir. 

 

Link to comment
Share on other sites

On 7/22/2020 at 6:47 PM, jofefo said:

En el index la siguiente consulta tarda 4.4 ms y devuelve 5138 resultados, no se si es normal que devuelva tantos resultados y tarde tanto.  


SELECT SQL_NO_CACHE c.`name`, cl.`id_lang`, IF(cl.`id_lang` IS NULL, c.`value`, cl.`value`) AS value, c.id_shop_group, c.id_shop
FROM `ps_configuration` c
LEFT JOIN `ps_configuration_lang` cl ON (c.`id_configuration` = cl.`id_configuration`)

 

Esta consulta lo que hace es cargar los parámetros de configuración de TODAS las tiendas (a no ser que esté cortada la consulta, porque no lleva ningún WHERE). De modo que si tienes activada la multitienda y creadas varias tiendas es normal que cargue un montón de resultados. 

He probado la consulta en una tienda "simple" (sin multitienda), y se obtienen unos 800 resultados y tarda 0.0009 s, aunque esto también depende de los recursos del servidor. De todos modos, 4.4 ms (0.0044s) tampoco me parece un tiempo excesivo para una consulta SQL.

Link to comment
Share on other sites

  • 1 year later...

Hola

Se que este es un tema un poco viejo, pero el problema  aún persiste.

Creo que los comentarios anteriores hay un error de interpretación, realmente no se envían casi 5000 filas al hacer la consulta, el problema esta en que se escanean las 5000, en mi caso lo que sucede es que se omite el PRIMARY KEY es como si el index no existiera,

Ej

 

Query_time: 0.003282  Lock_time: 0.000044  Rows_sent: 1  Rows_examined: 4095

 

El problema no esta en que la consulta sea rápida o lenta, evidentemente tarda muy poco, el problema real esta en revisar 4095 filas y aveces más de  5000 filas para enviar solo una.

Sí, la consulta solo tarda 0.0032, pero al no usar el INDEX y escanear + 4000 filas, se genera un problema de uso muy elevado de CPU. Sobre todo cuando se tienen unas cientas de visitas navegando, el uso de CPU de la base de datos se dispara.

Creo que ese es el punto inicial de este hilo, no es enviar 4000 resultados, si no escanear tal cantidad de filas para enviar 1, ahora bien, la variación de revisar más o menos filas ya depende de cuantos datos tiene esa columna, si tiene 10 000 escaneará 10k y más CPU usará.

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...