[MySQL] Comment diminuer (optimiser ?) la taille d'un base

Comment diminuer (optimiser ?) la taille d'un base [MySQL] - SQL/NoSQL - Programmation

Marsh Posté le 13-01-2006 à 12:47:19    

bonjour,
 
j'ai une table de plus de 7000 entées qui commence à devenir un peu lourde (donc qui ralentit, et qui devient pénible à sauvegarder) : pres de 5MO.
 
Y-a-t'il des méthodes pour la "dégraisser", ou pour optimiser sa taille ?
j'ai utilisé la fonction optimize table qui n'a apparemment pas changé grand chose...  
 
merci de vos conseils  :)


Message édité par jerkeve le 13-01-2006 à 12:48:17
Reply

Marsh Posté le 13-01-2006 à 12:47:19   

Reply

Marsh Posté le 13-01-2006 à 12:57:26    

et si tu donnais la structure ? 7000 lignes et 5Mo ça fait pas mal d'octets par ligne :eek:


---------------
La musique c'est comme la bouffe, tu te souviens du restaurant dans lequel t'as bien mangé 20 ans plus tôt, mais pas du sandwich d'il y a 5 minutes :o - Plugin pour winamp ©Harkonnen : http://harko.free.fr/soft
Reply

Marsh Posté le 13-01-2006 à 13:14:53    

passer sous sql server :o


---------------
Hobby eien /人◕ ‿‿ ◕人\
Reply

Marsh Posté le 13-01-2006 à 13:23:29    


Avant de construire une table il faut essayer de reflechir à une structure robuste, cohérente et qui empeche la duplication des données.
 
Si tu vois que ta table contient énormement de colonnes et que les données se repètent, alors tu as un problème de structure, et tu dois essayer de la séparer en plusieurs tables.
 
Je suis pas convaincu que passer sous sql server change quoi que ce soit à ce problème, c'est pas un probleme de langage ou de logiciel, c'est un probleme de gestion de base de données en général.

Reply

Marsh Posté le 13-01-2006 à 14:04:41    

j'avais essaye de refléchir avant, je ne pense pas qu'il y ait des données dupliquées, mais c'est ne base dans laquelle les champs sont souvent des champs de type txt (base de données pour accueillir des critiques de livres, les littéraires sont des verbeux :))
 
je ne crois pas que ce soit la structure qui soit en cause. c'est la base elle meme qui fait 5MO, pas une table particulière.
 
Donc pas de méthode "code" pour un nettoyage quelconque ou une compression des données inutilisées ... ?

Reply

Marsh Posté le 13-01-2006 à 14:33:09    

c'est un peu incohérent ton histoire..
 
c'est une table ou la somme des tables qui fait 5Mo ?
 
tu as des données "inutilisées" ? tu peux pas les mettre à part ou séparer un peu plus tes infos ?


---------------
La musique c'est comme la bouffe, tu te souviens du restaurant dans lequel t'as bien mangé 20 ans plus tôt, mais pas du sandwich d'il y a 5 minutes :o - Plugin pour winamp ©Harkonnen : http://harko.free.fr/soft
Reply

Marsh Posté le 13-01-2006 à 14:36:30    

c'est la base, le fichier base.sql si tu veux, qui fait pres de 5MO
Non, je ne pense pas avoir de données inutilisées. ma question etait : y a-t-il des methodes de compression par exemple.
Si c'est non, tant pis, mais je ne vois pas ce qu'il y a d'incohérent dans cette question ...

Reply

Marsh Posté le 13-01-2006 à 14:45:55    

la base et le dump c'est pas tout à fait la même chose (surtout si c'est un dump avec un INSERT pour chaque ligne)
 
donc en fait le problème c'est que c'est long à restaurer / sauvegarder c'est ça ? et tu utilise phpmyadmin pour faire tout ça ?
 
non, pas de compression disponible autre que la compression du dump une fois généré
 
par contre il est possible de sauvegarder structure d'un coté et contenu dans un CSV, c'est moins lourd (mais faut avoir pris ses précautions avant, surtout si t'as des textes, ou bien choisir ses délimiteurs)
 


---------------
La musique c'est comme la bouffe, tu te souviens du restaurant dans lequel t'as bien mangé 20 ans plus tôt, mais pas du sandwich d'il y a 5 minutes :o - Plugin pour winamp ©Harkonnen : http://harko.free.fr/soft
Reply

Marsh Posté le 13-01-2006 à 14:59:52    

merci de ta reponse :)
oui et non pour la sauvegarde :  
j'utilise aussi un script php que j'ai fait, et qui se lance automatiquement tous le soirs avec un cron; et justement le pb c'est qu'il met maintenant plus de 30sec à s'executer (limitation PHP de mon serveur...), et du coup il faut faire ces sauvegardes "à la main" avec PHPmyadmin...
Je n'avais pas pensé à gérer à part la structure et les données, mais je crains que ce ne soit pas la structure qui soit lourde???
 
je vais sinon voir du cote d'une 2eme base à partir de l'enregistrement 10 000 par exemple, mais ca va etre lourd en code :-/ ...


Message édité par jerkeve le 13-01-2006 à 15:01:41
Reply

Marsh Posté le 13-01-2006 à 15:02:48    

si tu veux séparer facilement tes données, regarde du coté du type MERGE (marrant, ça fait déjà 2 fois aujourd'hui que j'arrive à  le caler celui là)
 
et tu devrais aussi refaire / vérifier ton script et les index
 
pour le CSV, c'est la méthode de chargement qui est plus efficace, le dump SQL c'est lourd comme tout


---------------
La musique c'est comme la bouffe, tu te souviens du restaurant dans lequel t'as bien mangé 20 ans plus tôt, mais pas du sandwich d'il y a 5 minutes :o - Plugin pour winamp ©Harkonnen : http://harko.free.fr/soft
Reply

Marsh Posté le 13-01-2006 à 15:02:48   

Reply

Marsh Posté le 13-01-2006 à 15:04:24    

ma solution avec sql server n'etait pas idiote :o


---------------
Hobby eien /人◕ ‿‿ ◕人\
Reply

Marsh Posté le 13-01-2006 à 15:04:59    

Tamahome a écrit :

ma solution avec sql server n'etait pas idiote :o


 
certes, mais un poil plus onéreuse [:aloy]


---------------
La musique c'est comme la bouffe, tu te souviens du restaurant dans lequel t'as bien mangé 20 ans plus tôt, mais pas du sandwich d'il y a 5 minutes :o - Plugin pour winamp ©Harkonnen : http://harko.free.fr/soft
Reply

Marsh Posté le 13-01-2006 à 15:12:39    

c'est plus leger ?
quels sont les avantages ? je ne me suis jamais posé la question, au fond...

Reply

Marsh Posté le 13-01-2006 à 15:22:23    

Sh@rdar a écrit :


 
pour le CSV, c'est la méthode de chargement qui est plus efficace, le dump SQL c'est lourd comme tout


 
euh... que veux tu dire concretement pas là ??? je suis  [:alex_]  , dsl, mais je ne vois pas ?


Message édité par jerkeve le 13-01-2006 à 15:22:52
Reply

Marsh Posté le 13-01-2006 à 15:23:59    

La méthode la plus rapide pour faire une sauvegarde mysql, c'est un 'select into outfile "nom du fichier" ' et son acolite "load data infile".
Là où je bosse on arrive à sauvegarder 7 Go de données en moins de 30 minutes soit 3.8 Mo/s si je me trompe pas.
Par contre, il faut avoir le droit pour faire ça et il faut aussi avoir un serveur pas trop saturé. Le notre est puissant avec des disques SCSI et le nombre de requettes par secondes est assez faible à l'heure où on fait la sauvegarde.
Avec cette méthode, il faut pas oublier de faire en plus une requette pour obtenir une sauvegarde de la structure de la base.

Reply

Marsh Posté le 13-01-2006 à 15:29:42    

la manière d'insérer les données n'est pas la même [:spamafote]
 
sinon tu peux utiliser du INSERT DELAYED aussi


---------------
La musique c'est comme la bouffe, tu te souviens du restaurant dans lequel t'as bien mangé 20 ans plus tôt, mais pas du sandwich d'il y a 5 minutes :o - Plugin pour winamp ©Harkonnen : http://harko.free.fr/soft
Reply

Marsh Posté le 13-01-2006 à 15:33:39    

IMHO si ça rame avec 7000 lignes ( ce qui n'est vraiment pas grand chose même pour mysql) je pencheraiss plus pour une absence d'indexes qui vont bien et/ou a des requêtes mal ecrites...
 
edit: question par ailleurs ta table tu lui a mis quel type? MyISAM?


Message édité par anapajari le 13-01-2006 à 15:35:57
Reply

Marsh Posté le 13-01-2006 à 15:34:17    

OK Sh@rdar merci. J'ai fait un test "manuel" d'exportation de la base en CSV et non plus MySQL, effectivement les poind du fichier est divisé par deux.
 
Reste plus qu'à trouver un nouveau script pho ou autre pour exporter ca automatiquement (c'est le but final...)
 
> anapajari : ce n'est pas l'utilisationde la base qui rame... ce qui doit etre indexe l'est, c'est la sauvegarde...

Message cité 1 fois
Message édité par jerkeve le 13-01-2006 à 15:35:30
Reply

Marsh Posté le 13-01-2006 à 15:34:40    

c'est pas grand chose tout court :o une base qui rame c'est une base mal conçue, pas trop peuplée :o


---------------
La musique c'est comme la bouffe, tu te souviens du restaurant dans lequel t'as bien mangé 20 ans plus tôt, mais pas du sandwich d'il y a 5 minutes :o - Plugin pour winamp ©Harkonnen : http://harko.free.fr/soft
Reply

Marsh Posté le 13-01-2006 à 15:35:30    

jerkeve a écrit :

OK Sh@rdar merci. J'ai fait un test "manuel" d'exportation de la base en CSV et non plus MySQL, effectivement les poind du fichier est divisé par deux.
 
Reste plus qu'à trouver un nouveau script pho ou autre pour exporter ca automatiquement (c'est le but final...)


 
 
fait attention avec tes champs textes, ils doivent être bourrés de \r\n et la réimportation n'est pas gagnée :o


---------------
La musique c'est comme la bouffe, tu te souviens du restaurant dans lequel t'as bien mangé 20 ans plus tôt, mais pas du sandwich d'il y a 5 minutes :o - Plugin pour winamp ©Harkonnen : http://harko.free.fr/soft
Reply

Marsh Posté le 13-01-2006 à 15:37:21    

Sh@rdar a écrit :

fait attention avec tes champs textes, ils doivent être bourrés de \r\n et la réimportation n'est pas gagnée :o


 
 
vi... je me posais la question...

Reply

Marsh Posté le 13-01-2006 à 19:54:00    

7000 entrées, 5Mo :/ moi je trouve ca léger
si le problème est un problème de performances, je pense que, comme le dit anapajari ca doit être des tables qui n'ont pas de bons indexes
pour la sauvegarde, si tu as la main sur le serveur, ne fais pas tes scripts de backups en PHP

Reply

Marsh Posté le 13-01-2006 à 19:59:14    

merci couak, je ne pense pas que ce soit un pb de table ou d'index, ca doit etre correct sur ce plan là. Un table qui content des livres entier ce n'ets pas la meme chose q'une table de forum...  
 
par contre je suis effectivement en train de voir une solution pour récuperer la base compressee avec un script shell qui ne sera pas limité par la limite du php.ini (30 sec. d'execution.. c'ets court!)
Ca devrait marcher... il ne me manque que 20 sec. au plus.

Reply

Marsh Posté le 13-01-2006 à 20:23:27    

tu veux vraiment pas la filer ta structure ? :o


---------------
La musique c'est comme la bouffe, tu te souviens du restaurant dans lequel t'as bien mangé 20 ans plus tôt, mais pas du sandwich d'il y a 5 minutes :o - Plugin pour winamp ©Harkonnen : http://harko.free.fr/soft
Reply

Marsh Posté le 14-01-2006 à 16:55:03    

pourquoi tu ne fais pas un dump de la base avec mysqldump ?

Reply

Marsh Posté le 14-01-2006 à 23:13:23    

couak a écrit :

pourquoi tu ne fais pas un dump de la base avec mysqldump ?


 
c'est ce que je vais faire, effectivement  :)  
 
> Sh@rdar : je ne vois pas l'interet, c'est long il y a 15 tables, et je sais tres bien qu'il n'y a pas de pb de structure à priori   :hello:  
 
Merci à tous de votre aide, c'est réglé avec un sauvegarde par shell

Reply

Marsh Posté le 16-01-2006 à 13:48:05    

jerkeve a écrit :

c'est la base, le fichier base.sql si tu veux, qui fait pres de 5MO
Non, je ne pense pas avoir de données inutilisées. ma question etait : y a-t-il des methodes de compression par exemple.
Si c'est non, tant pis, mais je ne vois pas ce qu'il y a d'incohérent dans cette question ...


 
le dump (*.sql) est un ensemble de requetes d'insertion qui prend beaucoup plus de place que la base. avant transfert tu peux faire une compression de celui-ci (gzip).


---------------
MZP est de retour
Reply

Marsh Posté le 16-01-2006 à 13:52:41    

comme annoncé, si tu peux faire un mysqldump, ca reglera tes problemes. Pour un ordre d'idée, j'ai 40Mo de base, 500 000 enregistrements. Et le dump se fait en 20 seconde sur une vieille becane avec un disque merdique.


---------------
MZP est de retour
Reply

Marsh Posté le 16-01-2006 à 13:58:48    

Le probleme des portails c'est que tout est stoqué en base de données, ta base n'à pas fini de grossir, la ce que tu as c'est rien ca va devenir énorme avec le temps.
 
Il va soit falloir en tenir compte dans ton hébergement, soit revenir à des méthodes "anciennes", c'est à dire avoir des ressources en pages "statiques", pages statiques que tu référence dans ton portail. Le portail ne devrais te servir qu'à référencer des ressources, pas à stoquer des ressources.
 
Mais si tu stoque tout dans ton logiciel de portail, ta base va continuer à grossir, et les perfs vont se dégrader, à moins d'avoir un serveur dédié très puissant avec beaucoup de RAM.
 
Plusieurs sites important on du finir par fermer à cause de ce problême. Il faut soit passer en serveur dédié, soit revenir à du statique (même partiellement)

Message cité 1 fois
Message édité par Paul JR le 16-01-2006 à 14:00:13
Reply

Marsh Posté le 16-01-2006 à 14:23:48    

cinocks a écrit :

comme annoncé, si tu peux faire un mysqldump, ca reglera tes problemes. Pour un ordre d'idée, j'ai 40Mo de base, 500 000 enregistrements. Et le dump se fait en 20 seconde sur une vieille becane avec un disque merdique.


 
euh... concrètement, tu fais quoi ? Comment fais tu pour compresser dynamiquement ce fichier ? je ne vois pas trop ...
 

Paul JR a écrit :

Il faut soit passer en serveur dédié, soit revenir à du statique (même partiellement)


 
Pour le statique.. je ne vois vraiment pas comment faire avec une boutique de 10 000 produits évolutifs ... le dédié, peut etre, mais pas le statique

Message cité 1 fois
Message édité par jerkeve le 16-01-2006 à 14:26:14
Reply

Marsh Posté le 16-01-2006 à 14:31:17    

D'un autre côté, de trés nombreux sites dont certain assez gros continuent à grossir sans être sur du dédiés. Mais c'est vrai qu'ils ne sont pas resté, par exemple, chez free.
Le dédiés, c'est vraiment quand on en a besoin, il y a aussi de trés bons mutualisés qui arrivent à garder de bonnes performance.
En fait, avant de passer au dédié, il faut d'abord vérifier l'analyse de la base et entre autre les index pour être sur de ne pas perdre 95% du temps sur des bétises du à un mauvais index ou un index oublié. Il faut aussi vérifier si on a codé le site intélligement. (on a déjà vu sur ce forum des personnes qui cherchaient la liste des messages et qui ensuite refaisaient une requette par message pour avoir les infos du posteur)
 
Comme quoi, il faut pas généralisés à la va vite surtout sur ce genre de sujet.

Reply

Marsh Posté le 16-01-2006 à 14:36:20    

Pour le serveur, je suis sur du "tres bon mutualisé", chez Quetzal Network : ils ont leur propre salle blanche, et des BP non sur-bookées, en principe effectivement le pb ne vient pas de là...

Reply

Marsh Posté le 16-01-2006 à 14:38:08    

jerkeve a écrit :

euh... concrètement, tu fais quoi ? Comment fais tu pour compresser dynamiquement ce fichier ? je ne vois pas trop ...
 
 
 
Pour le statique.. je ne vois vraiment pas comment faire avec une boutique de 10 000 produits évolutifs ... le dédié, peut etre, mais pas le statique


 
Pas de compression dynamique. Le dump n'est qu'une copie textuelle du contenu de la base. Ce n'est pas les fichiers propres à la base. ;). une fois le dump, je compresse par gzip.
 
Mais ca ne compresse pas la base.


---------------
MZP est de retour
Reply

Marsh Posté le 16-01-2006 à 14:39:55    

ah! alors ok :)

Reply

Marsh Posté le 16-01-2006 à 14:42:27    

mais j'ai du mal à cerner ton probleme. C'est bien le dump qui te gene?


---------------
MZP est de retour
Reply

Marsh Posté le 16-01-2006 à 14:46:10    

oui, je le lance dynamiquement par un cron, et depuis script PHP.
Le pb venait du fait que le script met plus de 30 sec. à s'éxécuter, et donc le serveur l'empeche de se terminer puisque le php.ini impose cette limitation de 30 sec. Comme je suis sur du mutualisé, et que l'admin ne veut pas toucher à cette limitation (pour des pb de saturation en cas de scripts en boucle par exemple, je peux le comprendre), du coup ... je ne peux plus faire ce dump dynamiquement.
 
Sauf avec un shell, puisque dans ce cas je ne suis pas limité par le temps, c'ets ce que m'a proposé l'admin du serveur, et ca marche.
 
:)

Reply

Marsh Posté le 16-01-2006 à 14:50:16    

ca me parait plus coherent. C'est ton script qui faisait l'extraction des données?


---------------
MZP est de retour
Reply

Marsh Posté le 16-01-2006 à 15:29:29    

oui

Citation :


<?php
function mysql_structure() {
 
  $host = 'xxxxxxxxxx';
  $user = 'xxxxxxxxxx';
  $pass = 'xxxxxxxxxx';
  $base = 'xxxxxxxxxx';
   
  mysql_connect($host, $user, $pass);
  mysql_select_db($base);
  $tables = mysql_list_tables($base);
  while ($donnees = mysql_fetch_array($tables))
    {
    $table = $donnees[0];
    $res = mysql_query("SHOW CREATE TABLE $table" );
    if ($res)
      {
      $insertions = "";
      $tableau = mysql_fetch_array($res);
      $tableau[1] .= ";";
      $dumpsql[] = str_replace("\n", "", $tableau[1]);
      $req_table = mysql_query("SELECT * FROM $table" );
      $nbr_champs = mysql_num_fields($req_table);
      while ($ligne = mysql_fetch_array($req_table))
        {
        $insertions .= "INSERT INTO $table VALUES(";
        for ($i=0; $i<=$nbr_champs-1; $i++)
          {
          $insertions .= "'" . mysql_real_escape_string($ligne[$i]) . "', ";
          }
        $insertions = substr($insertions, 0, -2);
        $insertions .= " );\n";
        }
      if ($insertions != "" )
        {
        $dumpsql[] = $insertions;
        }
      }
    }
  return implode("\r", $dumpsql);
  }
 
 
// creation d'une fonction file_put_content (serveur PHP4) :
if(!function_exists('file_put_contents')) {
 function file_put_contents($filename, $data, $file_append = false) {
  $fp = fopen($filename, (!$file_append ? 'w+' : 'a+'));
  if(!$fp) {
   trigger_error('file_put_contents ne peut pas écrire dans le fichier.', E_USER_ERROR);
   return;
  }
  fputs($fp, $data);
  fclose($fp);
 }
}
 
// et envoi du fichier de dump sur le même niveau que ce fichier dump.php
echo "Dump OK : ".file_put_contents("sqldump-".$base."-".date("Ymd-His" ).".sql", mysql_structure());
?>


Message édité par jerkeve le 16-01-2006 à 15:33:46
Reply

Marsh Posté le 16-01-2006 à 15:39:39    

et pourquoi ne pas appeler la commande mysqldump depuis le script.


---------------
MZP est de retour
Reply

Marsh Posté le 16-01-2006 à 15:42:37    

euh ... je ne me suis pas pose la question qd j'ai cree celui la... C'est plus efficace et / ou rapide que mon script ?

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed