rvcat Posted February 8, 2015 Share Posted February 8, 2015 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 More sharing options...
Oron Posted February 9, 2015 Share Posted February 9, 2015 Bonjour Je déplace votre topic dans le forum Développement et adaptation de Prestashop, semble plus correspondre que ce forum café du commerce. Link to comment Share on other sites More sharing options...
rvcat Posted February 9, 2015 Author Share Posted February 9, 2015 oui bien sûr Link to comment Share on other sites More sharing options...
J. Danse Posted February 9, 2015 Share Posted February 9, 2015 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 More sharing options...
rvcat Posted February 9, 2015 Author Share Posted February 9, 2015 (edited) Les modifs seraient prises en compte rapidement ou pas ? Il faut faire comment les modifications dans github ? Sinon existe-il un moyen de bloquer les mises à jour ? Edited February 9, 2015 by rvcat (see edit history) Link to comment Share on other sites More sharing options...
coeos.pro Posted February 9, 2015 Share Posted February 9, 2015 je ne sais pas si changer quelques requêtes SQL accélérerait une boutique de manière significative, surtout avec les caches par fichiers. Link to comment Share on other sites More sharing options...
rvcat Posted February 9, 2015 Author Share Posted February 9, 2015 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 More sharing options...
coeos.pro Posted February 9, 2015 Share Posted February 9, 2015 ça doit être une erreur de leur part, un execute avec DELETE et 2 fois de suite... Comme le dit J., le mieux est de passer par le github Link to comment Share on other sites More sharing options...
J. Danse Posted February 9, 2015 Share Posted February 9, 2015 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 1 Link to comment Share on other sites More sharing options...
coeos.pro Posted February 9, 2015 Share Posted February 9, 2015 ce n'est pas anormal, mais autant utiliser la fonction delete qui est plus courte à écrire... Link to comment Share on other sites More sharing options...
rvcat Posted February 9, 2015 Author Share Posted February 9, 2015 (edited) 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 February 9, 2015 by rvcat (see edit history) Link to comment Share on other sites More sharing options...
rvcat Posted February 11, 2015 Author Share Posted February 11, 2015 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 More sharing options...
SOURIRE DES SAVEURS Posted May 30, 2015 Share Posted May 30, 2015 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 More sharing options...
rvcat Posted May 30, 2015 Author Share Posted May 30, 2015 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 More sharing options...
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now