Comment vider les grosses tables gourmandes comme connections/guest/cart


  • administrators

    J'ai de très grosses tables dans mon shop et on me conseille de les vider. Comment faire?


  • administrators

    La réponse courte est "ne pas le faire"


  • administrators

    La réponse longue "oui mais", mais justement les explication sont longue. J'y reviens tout bientôt


  • legacy

    Pour ma part j'utilise un script fait maison :

    <?php
        require(dirname(__FILE__).'/config/config.inc.php');
        
        /*******************************************************************************
        ********** Supression des Stats appelé par Cron *******************************
        *******************************************************************************/
        
        // nbr de jours à conserver
        $days=180; 	//connections etc ...
        $day_page=180; 	//page viewed
        
        // nbr de guest à conserver
        $nbGuest=5000;
        
        $interval=$days.' DAY';
        
        //1- ps_connections_pages delete
        $res=Db::getInstance()->Execute('
        DELETE FROM `'._DB_PREFIX_.'connections_page`
        WHERE time_start < DATE_SUB(NOW(), INTERVAL '.$interval.')');
        if(!$res)
        	die('error delete ps_connections_pages for '.$days.' day(s)');
        
        
        //2- ps_connections delete
        $res=Db::getInstance()->Execute('
        DELETE FROM `'._DB_PREFIX_.'connections`
        WHERE date_add < DATE_SUB(NOW(), INTERVAL '.$interval.')');
        if(!$res)
        	die('error delete ps_connections for '.$days.' day(s)');
        
        //3- ps_connections_source delete
        $res=Db::getInstance()->Execute('
        DELETE FROM `'._DB_PREFIX_.'connections_source`
        WHERE date_add < DATE_SUB(NOW(), INTERVAL '.$interval.')');
        if(!$res)
        	die('error delete ps_connections_source for '.$days.' day(s)');
        
        //4- ps_page_viewed delete
        $currentRange=DateRange::getCurrentRange();
        $endRange = $currentRange-$day_page;
        $res=Db::getInstance()->Execute('
        DELETE FROM `'._DB_PREFIX_.'page_viewed`
        WHERE id_date_range < '.$endRange);
        if(!$res)
        	die('error delete ps_page_viewed for '.$endRange.' date_range');
        
        //5- ps_guest delete
        $sql="SELECT `id_guest` FROM `ps_guest` ORDER BY `id_guest` DESC LIMIT 0, 1";
        $res = Db::getInstance()->ExecuteS($sql);
        if(!$res)
        	die('error select highest ps_guest');
        $currentGuest=$res[0]['id_guest'];
        $endGuest = $currentGuest-$nbGuest;
        $res=Db::getInstance()->Execute('
        DELETE FROM `'._DB_PREFIX_.'guest`
        WHERE id_guest < '.$endGuest);
        if(!$res)
        	die('error delete ps_guest for '.$endGuest.' endGuest');
        
        
    

  • administrators

    Ne m'en veux pas je vais regarder ça point par point.

    Bon les bons points:

    1. tu n'a pas fait de truncate que l'on voit dans plein de soluce à 2 reals et qui foutent un bordel pas croyable.
    2. tu n'a pas touché à des tables plus dangereuses

    Les moins bons:

    1. la directive NOW() n'a pas la même valeur tout au long du script et ça va poser des problèmes.
    2. connections_page et connections sont liées, si la connections_page pointe vers une connections inexistante ça fait du pas glop avec un id_connections égale à 0 dans les jointures. Pourquoi? à cause de 1. Impact mineur mais des "sessions" de page vont rester en mode camping. A noter de nombreuses connections sont recrées si elles n'existent plus.
    3. connections là attention lien de guest, un guest ne trouve plus sa connections. Impact mineur
    4. page_viewed, rien a dire
    5. guest là par contre id_guest est  sur customer, si il ne le trouve pas il le recrée - c'était bien la peine de supprimer.

  • legacy

    Je veux bien la version longue :)



  • Bonjour Doekia, même question pour un prestashop 1.7.3, peut on vider ces tables très imposantes, pour ma part ma BDD fait 250 Mo et seulement les tables Connection et Gest font 195 mo !!! si je peux totalement les vider ma BDD ne s'en portera pas plus mal ;)

    merci


  • administrators

    @briko-bike

    Si tu es prêt à perdre tout ton historique de visite, truncate les tables
    Sinon il faut faire des requête en suppression un peu compliquées et compte tenu de ton volume nous parlons de plusieurs jours de maintenance pour faire cela - lock des tables connexion == aucune visite web possible.

    J'ai fais un module de nettoyage - par cron qui résoud ce problème
    https://store.enter-solutions.com/fr/75-housekeeper.html
    Compte tenu de ton volume à nettoyer il faudra plusieurs semaine avant que les tables retrouvent une taille normale.

    ATTENTION: Lorsque le cron s'exécute (ou que tu le lance manuellement) ton shop est quasi inaccessible en raison des locks en suppressions sur des tables essentielles.

    Il (le module) limite les suppressions à 10'000 paniers et 25'000 connexions/guest par exécution afin de ne pas mettre le bazar dans trafic .


Se connecter pour répondre
 

Il semble que votre connexion ait été perdue, veuillez patienter pendant que nous vous re-connectons.