Jump to content

Requète SQL


Recommended Posts

Bonjour,

 

je débute dans Prestashop et j'ai regardé un peu les requêtes SQL qui sont faites.

Je trouve qu'il est tout a fait possible d'optimiser plusieurs requêtes d'utiliser les triggers, les intégrités référentielles ...

 

Faire que le moteur de bases de données soit utilisé et pas seulement pour y déposer des valeurs.

 

Existe-il une solution pour réécrire ces requêtes sans qu'une mise à jour vienne tout remettre ?

 

Merci.

Link to comment
Share on other sites

Bonjour,

 

Majoritairement, oui et non. Cette réponse vous aide, n'est-ce pas ? Pas du tout, je le conçois bien !

 

Plus sérieusement... Pour avoir fait une légère transposition des requêtes pour qu'elles soient compatibles SQL Server, je peux vous répondre sur plusieurs détails:

  • Tout d'abord, la seule méthode pour que la mise à jour n'écrase pas tout est d'utiliser les surcharges. Si surchage il y a, la mise à jour ne sert d'ailleurs plus à rien, finalement.
  • Ensuite, le gros du gros repose également sur les modules: et là, aucunes surcharges possibles (directement, nativement du moins).

Finalement, une "bonne" idée/méthode serait de vous proposer de faire vos propositions modifiées sur GitHub, ainsi l'ensemble de la communauté profiterait des améliorations de performances ET vous aurez le tout intégré nativement.

 

Mais, entre nous, c'est un boulot dingue et qui prends pas mal de temps.

Link to comment
Share on other sites

voici un exemple complètement stupide. Il font 2x la même requête (cf classes/webservice/webservicekey.php)

 

public function deleteAssociations()
{
if (Db::getInstance()->execute('
DELETE FROM `'._DB_PREFIX_.'webservice_permission`
WHERE `id_webservice_account` = '.(int)$this->id) === false
||
Db::getInstance()->execute('
DELETE FROM `'._DB_PREFIX_.'webservice_permission`
WHERE `id_webservice_account` = '.(int)$this->id) === false)
return false;
return true;
}
 
Et ça c'est un exemple parmi d'autre
Link to comment
Share on other sites

Voilà, exactement. Des erreurs, ils en subsistent à coup sur.

 

Et pour répondre à la question, ce genre de correctif sera vite pris en compte, une refonte plus "grosse" le sera moins vite, sinon.

 

Un execute() avec DELETE n'est pas anormal, par contre.

 

PS: Voici la proposition GitHub que j'ai effectué: https://github.com/PrestaShop/PrestaShop/pull/2459/files

  • Like 1
Link to comment
Share on other sites

c'est nettement mieux.

Je ne vais pas aller plus loin car il faudrait tout corriger et github je ne connais pas du tout.

 

J'ai regardé le code à cause d'un ajout d'un nouveau produit qui à mis 7 min pour s'enregistrer en base. Ce n'est pas logique.

 

une petite perle que j'adore et après fini ça vient de classes/product.php.

4 requêtes sur la même table avec des critères différents. Le or dans la clause where, ils ne doivent pas connaitre.

 

public static function getDefaultAttribute($id_product, $minimum_quantity = 0)
{
static $combinations = array();


if (!Combination::isFeatureActive())
return 0;


if (!isset($combinations[$id_product]))
$combinations[$id_product] = array();
if (isset($combinations[$id_product][$minimum_quantity]))
return $combinations[$id_product][$minimum_quantity];


$sql = 'SELECT product_attribute_shop.id_product_attribute
FROM '._DB_PREFIX_.'product_attribute pa
'.Shop::addSqlAssociation('product_attribute', 'pa').'
'.($minimum_quantity > 0 ? Product::sqlStock('pa', 'pa') : '').
' WHERE product_attribute_shop.default_on = 1 '
.($minimum_quantity > 0 ? ' AND IFNULL(stock.quantity, 0) >= '.(int)$minimum_quantity : '').
' AND pa.id_product = '.(int)$id_product;
$result = Db::getInstance()->getValue($sql);


if (!$result)
{
$sql = 'SELECT product_attribute_shop.id_product_attribute
FROM '._DB_PREFIX_.'product_attribute pa
'.Shop::addSqlAssociation('product_attribute', 'pa').'
'.($minimum_quantity > 0 ? Product::sqlStock('pa', 'pa') : '').
' WHERE pa.id_product = '.(int)$id_product
.($minimum_quantity > 0 ? ' AND IFNULL(stock.quantity, 0) >= '.(int)$minimum_quantity : '');


$result = Db::getInstance()->getValue($sql);
}


if (!$result)
{
$sql = 'SELECT product_attribute_shop.id_product_attribute
FROM '._DB_PREFIX_.'product_attribute pa
'.Shop::addSqlAssociation('product_attribute', 'pa').'
WHERE product_attribute_shop.`default_on` = 1
AND pa.id_product = '.(int)$id_product;


$result = Db::getInstance()->getValue($sql);
}


if (!$result)
{
$sql = 'SELECT product_attribute_shop.id_product_attribute
FROM '._DB_PREFIX_.'product_attribute pa
'.Shop::addSqlAssociation('product_attribute', 'pa').'
WHERE pa.id_product = '.(int)$id_product;


$result = Db::getInstance()->getValue($sql);
}


$combinations[$id_product][$minimum_quantity] = $result;
return $result;
}
Edited by rvcat (see edit history)
Link to comment
Share on other sites

Le moteur de base de données est MariaDB version 10.0.

 

Après 1 journée de boulot a recréer les index primaires sur des clés autoinc et créer les index secondaires sur les clés des tables, l'enregistrement des produits a gagné en temps.

 

On est passé de 8 min 12 secondes pour enregistrer un produit avec 20 déclinaisons à 30 secondes.

 

30 secondes ça reste trop.

 

La régle que j'ai utilisée pour les tables :

les index primaires composés de plusieurs champs sont supprimés.

l'index primaire est composé d'un seul champ autoinc (ajouté si besoin).

les clés des tables (id_.....) ont chacun leur index (ça c'est pour préparer les intégrités référencielles).

 

Pour ma base, il y a un peu moins de 300 tables.

 

Je suis certain que les sites qui souhaitent mettre en place une multi-boutique en multi-langues, ils ne choisissent pas  prestashop tel qu'il est là sans index.

 

Il est très clair que les dev ne réfléchissent pas dans leurs requêtes, pourtant ils ont dans les mains un bon produit, aide en ligne, prise en main au top.

 

 

 

Link to comment
Share on other sites

  • 3 months later...

Le moteur de base de données est MariaDB version 10.0.

 

Après 1 journée de boulot a recréer les index primaires sur des clés autoinc et créer les index secondaires sur les clés des tables, l'enregistrement des produits a gagné en temps.

 

On est passé de 8 min 12 secondes pour enregistrer un produit avec 20 déclinaisons à 30 secondes.

 

30 secondes ça reste trop.

 

La régle que j'ai utilisée pour les tables :

les index primaires composés de plusieurs champs sont supprimés.

l'index primaire est composé d'un seul champ autoinc (ajouté si besoin).

les clés des tables (id_.....) ont chacun leur index (ça c'est pour préparer les intégrités référencielles).

 

Pour ma base, il y a un peu moins de 300 tables.

 

Je suis certain que les sites qui souhaitent mettre en place une multi-boutique en multi-langues, ils ne choisissent pas  prestashop tel qu'il est là sans index.

 

Il est très clair que les dev ne réfléchissent pas dans leurs requêtes, pourtant ils ont dans les mains un bon produit, aide en ligne, prise en main au top.

bonjour,

suite à des lenteurs sur l'admin de prestashop, tous les prestashop confondus, suite à la re-création sans cesse de mes sites internet de ce fait, j'ai pu comprendre que les lenteurs pourraient cesser en créant un index dans phpmyadmin, seulement, j'ai beau chercher, lire, je ne trouve pas d'aide à la création d'un index afin que la partie admin tourne correctement. Pourriez-vous m'apporter votre aide ? Lorsque je modifie le prix d'un produit, soit c'est très long, soit à force ça plante.

Merci

Link to comment
Share on other sites

si tu as un accès ssh à ta base de données, je te conseille heidisql (http://www.heidisql.com/) c'est le top pour créer les index. Ce que tu peux faire est de recréer la base en local et avec cet outil ajouter les index manquants.

 

pour ajouter un index, il suffit de faire un clic droit sur le champ et faire créer un index...

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