Jump to content

Optimizar Una Sql


schattenburg

Recommended Posts

Hola a todos:

Estoy creando mi primera SQL interna en una clase. Mi código es el siguiente:

 

$dias = 80;
$listIds = Cart::getIdsCarritosAbandonadosFull($dias);
 
Y luego en la clase cart.php tengo:
 
// ****************************************************
    public static function getIdsCarritosAbandonadosFull($dias) {
        $listIds = "";
        $sql = "select id_cart from ps_cart where date_add BETWEEN (date_sub(NOW(), INTERVAL ".$dias." DAY)) AND NOW()";
        if ($results = Db::getInstance()->ExecuteS($sql)) {
            foreach ($results as $row) {
                if (Cart::getTotalCart($row['id_cart'], true, Cart::BOTH_WITHOUT_SHIPPING) != '0,00 €') {
                    $listIds .= $row['id_cart'].",";
                }
            }
        }
        $listIds = substr($listIds, 0, -1); // quitar última coma
        return $listIds;
    }
 
Todo me funciona perfectamente. Me devuelve los ids de los últimos 80 días. El problema es que tarda muchísimo en devolvermelo, por lo menos 25 ó 30 segundos, y estoy seguro que es porque en Prestashop se pueden optimizar las SQL de alguna manera para que las ejecute más rápido. Sospecho que no se hace con el Select de toda la vida porque por lo que he visto por ahí en otras funciones hace SQL de esta forma:
 
$this->_select = "..."
$this->_join = "..."
$this->where = ".."
 
Y me pregunto si eso tendrá algo que ver para que las SQL se ejecuten internamente más rápido. ¿Cómo podría optimizar yo mi función para que no tarde tantísimo en devolver los valores? Muchas gracias

 

Link to comment
Share on other sites

El problema es que estas llamando X veces a Cart::getTotalCart

 

y esta función ya de por sí es costosa a nivel de SQL ya que llama al cálculo de precio de cada producto (getPriceStatic)... y esto, por desgracia, es muy costoso.

 

También ten en cuenta que en tu servidor localhost es posible que vaya mucho mas lento que en el hosting (optimización MysQL)

 

Lo suyo es mirar otra estrategia y plantearte hacer la sql entera tu mismo, ya que al buscar carritos vacíos puedes mirar filas de ps_cart que no tengan ps_cart_items

  • Like 2
Link to comment
Share on other sites

Las tablas son ps_cart y ps_cart_product (no items, perdona)

 

si lanzas

SELECT distinct c.id_cart FROM ps_cart c join ps_cart_product cp on c.id_cart=cp.id_cart WHERE 1

 

veras que sacas ids de carritos con productos, por lo que se entiende que su importe no es 0. Luego ya es cuestión de filtrar por fecha

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